using System; using CenterSpace.NMath.Core; namespace CenterSpace.NMath.Examples.CSharp { /// <summary> /// A .NET example in C# showing how to create a random number generator for a /// particular probability distribution using a specified uniform deviate /// method. Also shown is how to access and modify the uniform deviate /// generating object from the NMath Core random number generator object. /// </summary> class AdvancedRNGExample { static void Main( string[] args ) { Console.WriteLine(); // Create a RandomNumberGenerator.UniformRandomNumber delegate object // from the method System.Random.NextDouble(). var sysRand = new Random(); var uniformDeviates = new RandomNumberGenerator.UniformRandomNumber( sysRand.NextDouble ); // Now, construct a binomial random number generator using this delegate to // generate uniformly distributed random deviates between 0 and 1 (the // binomial generator will transform these uniform deviates into binomial // deviates). int trials = 2000; double prob = 0.002; var binRand = new RandGenBinomial( trials, prob, uniformDeviates ); // Create a vector of binomial deviates and use it to create a histogram. int n = 200; var randomVec = new DoubleVector( n, binRand ); // Create histogram int numBins = 20; var h = new Histogram( numBins, randomVec ); Console.WriteLine( h.StemLeaf() ); // Change the uniform deviate generator to use the method NextDouble() form // NMath Cores RandGenMTwist class. int seed = 0x124; // Construct the MT generator with the given seed. var mt = new RandGenMTwist( seed ); // Create the delegate. uniformDeviates = new RandomNumberGenerator.UniformRandomNumber( mt.NextDouble ); // Use the delegate to generate the uniform deviates necessary to for the // binomial generator. binRand.UniformDeviateMethod = uniformDeviates; // Generate a vector of binomial deviates. var randomSequence1 = new DoubleVector( n, binRand ); // All NMathCore random number generator classes have Reset() and Reset(int) // methods that attempt to reset the underlying uniform generator with the // time of day, for the no argument reset, or the given seed, for the integer // argument version. These methods return true if the reset was successful and // false if it was not. The reset methods will succeed if the following // conditions are met: // 1. The uniform generator delegate is an instance method, i.e. the Target // property of the Delegate class returns a non-null reference. // 2. The object reference thus obtained has a method named Initialize that // returns void and takes no arguments, for the Reset() method, or a // single integer argument for the Reset(int) method. // The RandGenMTwist class has an Initialize(int) method, so the Reset(int) // method should succeed. if ( binRand.Reset( seed ) ) { // Random sequences started using the same seed, so they should be identical. var randomSequence2 = new DoubleVector( n, binRand ); Console.WriteLine( "randomSequence1 == randomSequence2 is {0}", randomSequence1 == randomSequence2 ); } else { Console.WriteLine( "Could not reset generator" ); } Console.WriteLine(); Console.WriteLine( "Press Enter Key" ); Console.Read(); } } }← All NMath Code Examples