XUtils

mir-random

Advanced Random Number Generators.


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

Articles

  • coming soon...