Professional Random Number Generators
Documentation: http://docs.random.dlang.io/latest/index.html
#!/usr/bin/env dub
/+ dub.json:
{
"name": "test_random",
"dependencies": {"mir-random": "~>0.4.0"}
}
+/
import std.range, std.stdio;
import mir.random;
import mir.random.variable: NormalVariable;
import mir.random.algorithm: range;
void main()
{
auto sample = NormalVariable!double(0, 1).range.take(10).array;
sample[$.randIndex].writeln; // prints random element from the sample
}
#!/usr/bin/env dub
/+ dub.json:
{
"name": "test_random",
"dependencies": {"mir-random": "~>0.4.0"}
}
+/
import std.range, std.stdio;
import mir.random;
import mir.random.variable: NormalVariable;
import mir.random.algorithm: range;
void main(){
auto rng = Random(unpredictableSeed); // Engines are allocated on stack or global
auto sample = range!rng // Engines can passed to algorithms by alias or by pointer
(NormalVariable!double(0, 1)) // Random variables are passed by value
.take(10) // Fix sample length to 10 elements (Input Range API)
.array; // Allocates memory and performs computation
sample[$.randIndex].writeln; // prints random element from the sample
}
- Does not depend on DRuntime (Better C concept)
- Mir Random
rand!float
/rand!double
/rand!real
generates saturated real random numbers in(-1, 1)
. For example,rand!real
can produce more than 2^78 unique numbers. In other hand,std.random.uniform01!real
produces less than2^31
unique numbers with default Engine. - Mir Random fixes Phobos integer underflow bugs.
- Additional optimization was added for enumerated types.
- Random nd-array (ndslice) generation.
- Bounded integer generation in
randIndex
uses Daniel Lemire's fast alternative to modulo reduction. The throughput increase measured forrandIndex!uint
on an x86-64 processor compiled with LDC 1.6.0 was 1.40x forMt19937_64
and 1.73x forXoroshiro128Plus
. The throughput increase measured forrandIndex!ulong
was 2.36x forMt19937_64
and 4.25x forXoroshiro128Plus
.
- Uniform
- Exponential
- Gamma
- Normal
- Cauchy
- ...
- Simplex
- Sphere
- Multivariate Normal
- ...
- Ndslice and range API adaptors
opCall
API instead of range interface is used (similar to C++)- No default and copy constructors are allowed for generators.
unpredictableSeed
has not state, returnssize_t
- Any unsigned generators are allowed.
min
property was removed. Any integer generator can normalize its minimum down to zero.- Mt19937: +100% performance for initialization. (merged to Phobos)
- Mt19937: +54% performance for generation. (merged to Phobos)
- Mt19937: fixed to be more CPU cache friendly. (merged to Phobos)
- 64-bit Mt19937 initialization is fixed (merged to Phobos)
- 64-bit Mt19937 is default for 64-bit targets
- Permuted Congruential Generators (new)
- SplitMix generators (new)
- Fixed XorshiftEngine's support for non-
uint
word sizes & allow various shift directions - XorshiftStar Generators (new)
- Xoroshiro128Plus generator (new)
- Xoshiro256StarStar & Xoshiro128StarStar_32 generators (new)