This article presents a set of random number generators, based on a thin wrapper around the Boost.Random library.
Why?
There are a large number of random generators available in C++, through the Boost.Random
library.
Each generator has different properties, speed and domain, that makes it more suitable in specific applications.
Unfortunately, the .NET Framework provides the System.Random
class only. So here goes this article.
Quick Example
The generators are used in a similar way to the System.Random
object:
- Create a new generator, you must provide the seed:
using Boost.Random;
uint seed;
Mt11213b gen = new Mt11213b( seed );
- Call
Next
or NextDouble
:
rnd.Next();
rnd.NextDouble();
Generators
All the generators have kept their Boost name, but in camel notation. If you want more details about their properties, take a look at the Boost.Random
page.
Boost class | .NET wrapper class |
minstd_rand | MinStdRand |
minstd0_rand | MinStd0Rand |
ecuyer1988 | Ecuyer1988 |
kreutzer1986 | Kreutzer |
HELLEKALEK1995 | Helleklek1995 |
mt11213b | Mt11213b |
mt19937 | Mt19937 |
lagged_fibonacci607 | LaggedFibonacci607 |
lagged_fibonacci1279 | LaggedFibonacci1279 |
lagged_fibonacci2281 | LaggedFibonacci2281 |
lagged_fibonacci3217 | LaggedFibonacci3217 |
lagged_fibonacci4423 | LaggedFibonacci4423 |
lagged_fibonacci9689 | LaggedFibonacci9689 |
lagged_fibonacci19937 | LaggedFibonacci19937 |
lagged_fibonacci23209 | LaggedFibonacci23209 |
lagged_fibonacci44497 | LaggedFibonacci44497 |
Tests
Here are the result tests on 1000000 random generation. (you can do that test using the demo program).
Generator | Timing in seconds |
Random.Next | 0,0857201124723952 |
Ecuyer1988.Next | 0,574264885620938 |
Hellekalek1995.Next | 0,958088807376356 |
MinStd0Rand.Next | 0,15938422341387 |
MinStdRand.Next | 0,152292260608541 |
Mt11213b.Next | 0,0389937827293692 |
Mt19937.Next | 0,0402464559043119 |
Random.NextDouble | 0,0438223293742641 |
Ecuyer1988.NextDouble | 0,618387532493655 |
Jellekalek1995.NextDouble | 1,00235448918787 |
MinStd0Rand.NextDouble | 0,214150401796876 |
MinStdRand.NextDouble | 0,2078839629059 |
Mt11213b.NextDouble | 0,10741672475133 |
Mt19937.NextDouble | 0,108539772512987 |
LaggedFibonacci607.NextDouble | 0,0276551908133576 |
LaggedFibonacci1279.NextDouble | 0,0272001050412832 |
LaggedFibonacci3217.NextDouble | 0,0283938321769946 |
LaggedFibonacci4423.NextDouble | 0,0293869751602508 |
LaggedFibonacci44297.NextDouble | 0,0299146958621836 |
References
- Boost.Random library
- High-Performance Timer in C#
History
- 3rd October, 2003: Initial version
License
This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below.
A list of licenses authors might use can be found here.
Jonathan de Halleux is Civil Engineer in Applied Mathematics. He finished his PhD in 2004 in the rainy country of Belgium. After 2 years in the Common Language Runtime (i.e. .net), he is now working at Microsoft Research on Pex (http://research.microsoft.com/pex).