Non-Uniform Random Numbers in IronPython QuickStart Sample
Illustrates how to generate random numbers from a non-uniform distribution in IronPython.
View this sample in: C# Visual Basic F#
```Python import numerics from System import Array from Extreme.Statistics.Distributions import * from Extreme.Statistics.Random import * # Illustrates generating non-uniform random numbers # using the classes in the Extreme.Statistics.Random # namespace. # Random number generators and the generation # of uniform pseudo-random numbers are illustrated # in the UniformRandomNumbers QuickStart Sample. # In this sample, we will generate numbers from # an exponential distribution, and compare summary # results to what would be expected from # the corresponding Poisson distribution. meanTimeBetweenEvents = 0.42 # We will use the exponential distribution to generate the time # between events. The number of events per unit time follows # a Poisson distribution. # The parameter of the exponential distribution is the time between events. exponential = ExponentialDistribution(meanTimeBetweenEvents) # The parameter of the Poisson distribution is the mean number of events # per unit time, which is the reciprocal of the time between events: poisson = PoissonDistribution(1 / meanTimeBetweenEvents) # We use a MersenneTwister to generate the random numbers: random = MersenneTwister() # The totals array will track the number of events per time unit. totals = Array.CreateInstance(int, 15) currentTime = 0 endOfCurrentTimeUnit = 1 eventsInUnit = 0 totalTime = 0 count = 0 while currentTime < 100000: timeBetween = exponential.Sample(random) totalTime += timeBetween count = count + 1 # Alternatively, we could have written # timeBetween = random.NextDouble(exponential) # which would give an identical result. currentTime += timeBetween while currentTime > endOfCurrentTimeUnit: if eventsInUnit >= totals.Length: eventsInUnit = totals.Length-1 totals[eventsInUnit] = totals[eventsInUnit] + 1 eventsInUnit = 0 endOfCurrentTimeUnit = endOfCurrentTimeUnit + 1 eventsInUnit = eventsInUnit + 1 print "{0}", totalTime / count # Now print the totals print "# Events Actual Expected" for i in range(0, totals.Length): expected = 100000 * poisson.Probability(i) print "{0:8} {1:8} {2:8.1f}".format(i, totals[i], expected) ```