Introduction
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 them 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#
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).