Example (3 seconds)
void main()
{
import mir.random;
import mir.random.variable: normalVar;
import mir.random.algorithm: randomSlice;
auto sample = normalVar.randomSlice(10);
import std.stdio;
sample[$.randIndex].writeln;
}
Example (10 seconds)
void main()
{
import mir.random;
import mir.random.variable: normalVar;
import mir.random.algorithm: randomSlice;
// Engines are allocated on stack or global
auto rng = Random(unpredictableSeed);
auto sample = rng.randomSlice(normalVar, 10);
import std.stdio;
sample[rng.randIndex($)].writeln;
}
Comparison with Phobos
- Does not depend on DRuntime (Better C concept)
random
(new implementation and API)
- 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 than 2^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 for randIndex!uint
on an x86-64 processor compiled with LDC 1.6.0 was 1.40x for Mt19937_64
and 1.73x for Xoroshiro128Plus
. The throughput increase measured for randIndex!ulong
was 2.36x for Mt19937_64
and 4.25x for Xoroshiro128Plus
.
random.variable
(new)
- Uniform
- Exponential
- Gamma
- Normal
- Cauchy
- …
random.ndvariable
(new)
- Simplex
- Sphere
- Multivariate Normal
- …
random.algorithm
(new)
- Ndslice and range API adaptors