1234567891011121314151617181920212223242526272829303132333435363738 |
|
/*******************************************************************************
copyright: Copyright (c) 2008. Fawzi Mohamed
license: BSD style: $(LICENSE)
version: Initial release: July 2008
author: Fawzi Mohamed
*******************************************************************************/
module tango.math.random.engines.ArraySource;
/// very simple array based source (use with care, some methods in non uniform distributions
/// expect a random source with correct statistics, and could loop forever with such a source)
struct ArraySource{
uint[] a;
size_t i;
enum int canCheckpoint=false; // implement?
enum int canSeed=false;
static ArraySource opCall(uint[] a,size_t i=0)
in { assert(a.length>0,"array needs at least one element"); }
body {
ArraySource res;
res.a=a;
res.i=i;
return res;
}
uint next(){
assert(a.length>i,"error, array out of bounds");
uint el=a[i];
i=(i+1)%a.length;
return el;
}
ubyte nextB(){
return cast(ubyte)(0xFF&next());
}
ulong nextL(){
return ((cast(ulong)next())<<32)+cast(ulong)next();
}
}
|