/// <summary>Generate random numbers following a uniform distribution on a closed interval [a,b].
            /// </summary>
            /// <param name="n">The number of random values to generate.</param>
            /// <param name="data">The <paramref name="n" /> random numbers uniformly distributed over the interval [<paramref name="a" />,<paramref name="b" />] (output).</param>
            /// <param name="a">The left bound 'a'.</param>
            /// <param name="b">The right bound 'b'.</param>
            /// <param name="generationMode">The optional generation mode.</param>
            public void Uniform(int n, double[] data, double a, double b, RandomNumberSequence.UniformGenerationMode generationMode = null)
            {
                int errorCode;

                if (generationMode != null)
                {
                    if (generationMode is MklRandomNumberSequence.UniformGenerationMode)
                    {
                        var vslGenerationMode = (MklRandomNumberSequence.UniformGenerationMode)generationMode;
                        errorCode = vdRngUniform(vslGenerationMode.MagicNumber, m_Stream.m_Handle, n, data, a, b);
                    }
                    else
                    {
                        throw new ArgumentException("Generation mode is not a valid argument", "generationMode");
                    }
                }
                else  // use the standard method
                {
                    errorCode = vdRngUniform(UniformGenerationMode.Standard.MagicNumber, m_Stream.m_Handle, n, data, a, b);
                }

                if (errorCode != 0) // execution is not successful
                {
                    throw new InvalidOperationException("MKL: Return value " + errorCode + " in vdRngUniform.");
                }
            }
Ejemplo n.º 2
0
            /// <summary>Generate random numbers following a uniform distribution on a closed interval [a,b].
            /// </summary>
            /// <param name="n">The number of random values to generate.</param>
            /// <param name="data">The <paramref name="n" /> random numbers uniformly distributed over the interval [<paramref name="a" />,<paramref name="b" />] (output).</param>
            /// <param name="a">The left bound 'a'.</param>
            /// <param name="b">The right bound 'b'.</param>
            /// <param name="generationMode">The optional generation mode.</param>
            public void Uniform(int n, double[] data, double a, double b, RandomNumberSequence.UniformGenerationMode generationMode = null)
            {
                int errorCode = 0;

                _acml_UniformNumbers(ref n, ref a, ref b, m_RandomNumberStream.m_State, data, ref errorCode);
                if (errorCode != 0) // execution is not successful
                {
                    throw new InvalidOperationException("ACML: Return value " + errorCode + " in DRANDUNIFORM.");
                }
            }
Ejemplo n.º 3
0
        public void NextNumberSequenceUniform_LeapfrogEstimatedMean_ConvidenceInterval(int sampleSize, double a, double b, RandomNumberSequence.UniformGenerationMode generatorMode)
        {
            double expectedMean = (a + b) / 2.0;
            double expectedStandardDeviation = (b - a) / (2.0 * Math.Sqrt(3.0));

            IRandomNumberStream randomStream = GetRandomStream();

            Assume.That(randomStream.SplittingApproach.HasFlag(RandomNumberSequence.SplittingApproach.LeapFrog), String.Format("Random Number Generator {0} does not support Leapfrog approach.", randomStream.ToString()));

            int numberOfStreams = 5;  // use five sub-streams for Pseudo-Random-Number Generators

            if (randomStream.Generator is IQuasiRandomNumberGenerator)
            {
                numberOfStreams = (int)randomStream.Dimension;
            }
            var sample = new List <double>(sampleSize);

            for (int j = 0; j < numberOfStreams; j++)
            {
                var stream = randomStream.CreateLeapfrogStream(j, numberOfStreams);

                int subSampleSize = sampleSize / numberOfStreams;
                var subSample     = new double[subSampleSize];
                stream.NextNumberSequence.Uniform(subSampleSize, subSample, a, b, generatorMode);

                sample.AddRange(subSample);
            }
            /* compute estimated mean and standard deviation: */
            double estimatedMean = sample.Average();
            double estimatedStandardDeviation = GetEstimatedStandardDeviation(sample.ToArray(), sampleSize, estimatedMean);
            double epsilon = 2.0 * estimatedStandardDeviation / Math.Sqrt(sampleSize); // size of the confidence interval w.r.t. normal distribution N{-1}(0.975) \approx 1.96 \approx 2.0, i.e. \alpha/2 quantile with \alpha = 5%

            /* test whether E(X) \in [ estimatedMean - \epsilon, estimatedMean + \epsilon], where \epsilon = \sigma/\sqrt(n} */
            Assert.That((expectedMean >= estimatedMean - epsilon) && (expectedMean <= estimatedMean + epsilon), String.Format("a: {0}, b: {1}, Expectation: {2}, Standard deviation: {3}, estimated mean: {4}, estimated Standard Deviation: {5}, epsilon: {6}", a, b, expectedMean, expectedStandardDeviation, estimatedMean, estimatedStandardDeviation, epsilon));
        }
Ejemplo n.º 4
0
        public void NextNumberSequenceUniform_EstimatedMean_ConvidenceInterval(int sampleSize, double a, double b, RandomNumberSequence.UniformGenerationMode generatorMode)
        {
            double expectedMean = (a + b) / 2.0;
            double expectedStandardDeviation = (b - a) / (2.0 * Math.Sqrt(3.0));

            var sample = new double[sampleSize];
            IRandomNumberStream randomStream = GetRandomStream();

            randomStream.NextNumberSequence.Uniform(sampleSize, sample, a, b, generatorMode);

            double estimatedMean = sample.Average();
            double estimatedStandardDeviation = GetEstimatedStandardDeviation(sample, sampleSize, estimatedMean);
            double epsilon = 2.0 * estimatedStandardDeviation / Math.Sqrt(sampleSize); // size of the confidence interval w.r.t. normal distribution N{-1}(0.975) \approx 1.96 \approx 2.0, i.e. \alpha/2 quantile with \alpha = 5%

            /* test whether E(X) \in [ estimatedMean - \epsilon, estimatedMean + \epsilon], where \epsilon = \sigma/\sqrt(n} */
            Assert.That((expectedMean >= estimatedMean - epsilon) && (expectedMean <= estimatedMean + epsilon), String.Format("a: {0}, b: {1}, Expectation: {2}, Standard deviation: {3}, estimated mean: {4}, estimated Standard Deviation: {5}, epsilon: {6}", a, b, expectedMean, expectedStandardDeviation, estimatedMean, estimatedStandardDeviation, epsilon));
        }
Ejemplo n.º 5
0
        public void NextNumberSequenceUniform_SkipAheadEstimatedMean_ConvidenceInterval(int sampleSize, double a, double b, RandomNumberSequence.UniformGenerationMode generatorMode)
        {
            double expectedMean = (a + b) / 2.0;
            double expectedStandardDeviation = (b - a) / (2.0 * Math.Sqrt(3.0));

            IRandomNumberStream randomStream = GetRandomStream();

            Assume.That(randomStream.SplittingApproach.HasFlag(RandomNumberSequence.SplittingApproach.SkipAhead), String.Format("Random Number Generator {0} does not support Leapfrog approach.", randomStream.ToString()));

            var sample          = new List <double>();
            int numberOfStreams = 2;
            int nskip           = sampleSize * numberOfStreams;

            for (int j = 0; j < numberOfStreams; j++)
            {
                var stream = randomStream.CreateSkipAheadStream(j * nskip);

                int subSampleSize = sampleSize / numberOfStreams;
                var subSample     = new double[subSampleSize];
                stream.NextNumberSequence.Uniform(subSampleSize, subSample, a, b, generatorMode);

                sample.AddRange(subSample);
            }
            sampleSize = sample.Count;

            /* alternativly, use: */

            /*
             * var stream1 = randomStream.CreateSkipAheadStream(5);
             * var stream2 = stream1.CreateSkipAheadStream(5);
             * var stream3 = stream2.CreateSkipAheadStream(5);
             *
             * int subSampleSize = sampleSize / 3;
             * var sample1 = new double[subSampleSize];
             * stream1.NextNumberSequence.Uniform(subSampleSize, sample1, a, b, generatorMode);
             *
             * var sample2 = new double[subSampleSize];
             * stream2.NextNumberSequence.Uniform(subSampleSize, sample2, a, b, generatorMode);
             *
             * var sample3 = new double[subSampleSize];
             * stream3.NextNumberSequence.Uniform(subSampleSize, sample3, a, b, generatorMode);
             *
             * var sample = new List<double>();
             * sample.AddRange(sample1);
             * sample.AddRange(sample2);
             * sample.AddRange(sample3);
             */

            /* compute estimated mean and standard deviation: */
            double estimatedMean = sample.Average();
            double estimatedStandardDeviation = GetEstimatedStandardDeviation(sample.ToArray(), sampleSize, estimatedMean);
            double epsilon = 2.0 * estimatedStandardDeviation / Math.Sqrt(sampleSize); // size of the confidence interval w.r.t. normal distribution N{-1}(0.975) \approx 1.96 \approx 2.0, i.e. \alpha/2 quantile with \alpha = 5%

            /*
             * Even for a fixed seed the results of the random sampling are not identically (for Intel's MKL Library)!
             *
             * Therefore we enlarge the convidence interval - this unit test is not part of a test suite for Random Number Generators.
             * We focus on the integration with the native Dll.
             */
            epsilon *= 2.0;  // special adjustment, in most cases not necessary

            /* test whether E(X) \in [ estimatedMean - \epsilon, estimatedMean + \epsilon], where \epsilon = \sigma/\sqrt(n} */
            Assert.That(estimatedMean - epsilon, Is.LessThanOrEqualTo(expectedMean), String.Format("a: {0}, b: {1}, Expectation: {2}, Standard deviation: {3}, estimated mean: {4}, estimated Standard Deviation: {5}, epsilon: {6}", a, b, expectedMean, expectedStandardDeviation, estimatedMean, estimatedStandardDeviation, epsilon));
            Assert.That(estimatedMean + epsilon, Is.GreaterThanOrEqualTo(expectedMean), String.Format("a: {0}, b: {1}, Expectation: {2}, Standard deviation: {3}, estimated mean: {4}, estimated Standard Deviation: {5}, epsilon: {6}", a, b, expectedMean, expectedStandardDeviation, estimatedMean, estimatedStandardDeviation, epsilon));
        }