1
0
Files
otyaSMILEBASIC/SMILEBASIC/random.d
2017-07-06 22:06:06 +09:00

66 lines
1.4 KiB
D

module otya.smilebasic.random;
import std.random;
import tinymt32;
struct TinyMT(uint mat1 = 0x8f7011ee, uint mat2 = 0xfc78ff1f, uint tmat = 0x3793fdff)
{
tinymt32_t tinymt = tinymt32_t([0, 0, 0, 0], mat1, mat2, tmat);
this(uint x)
{
seed(x);
}
void seed(uint seed)
{
tinymt32_init(&tinymt, seed);
popFront;
}
private uint f;
void popFront()
{
f = tinymt32_generate_uint32(&tinymt);
}
typeof(this) save() @safe pure nothrow @nogc
{
return this;
}
uint front() @safe pure nothrow @nogc const
{
return f;
}
enum isUniformRandom = true;
enum empty = false;
enum min = uint.min;
enum max = uint.max;
}
class Random
{
alias RandomType = TinyMT!();
RandomType[8] engine;
public this()
{
foreach (ref e; engine)
{
e.seed(unpredictableSeed);
}
}
public T random(T)(int seedid, T min, T max)
{
return uniform(min, max, engine[seedid]);
}
public double RNDF(int seedid)
{
auto d = uniform(0.0, 1.0, engine[seedid]);
uniform(0.0, 1.0, engine[seedid]);//why??????????????
return d;
}
public void randomize(int seedid)
{
engine[seedid].seed(unpredictableSeed);
}
public void randomize(int seedid, int seed)
{
engine[seedid].seed(seed);
}
}