Is continuously seeding a random number generator performance intensive?
monarch_dodra
monarchdodra at gmail.com
Tue Jan 21 09:51:43 PST 2014
On Tuesday, 21 January 2014 at 17:13:39 UTC, Jeroen Bollen wrote:
> On Friday, 17 January 2014 at 19:00:29 UTC, Jeroen Bollen wrote:
>> On Wednesday, 15 January 2014 at 21:00:57 UTC, Jeroen Bollen
>> wrote:
>>> How do you correctly create a MersenneTwisterEngine with a
>>> ulong as seed?
>>
>> This question still isn't answered by the way.
>
> Come on, surely someone knows how to. I've already tried the
> obvious, but it doesn't work.
>
> MersenneTwisterEngine!(ulong, 32, 624, 397, 31, 0x9908b0df, 11,
> 7, 0x9d2c5680, 15, 0xefc60000, 18) rndEngine;
> rndEngine = MersenneTwisterEngine(seed);
>
> "shift by 32 is outside the range 0..31"
> "static assert (false && 4022730752LU <= 0LU) is false"
> "instantiated from here: MersenneTwisterEngine!(ulong, 32, 624,
> 397, 31, 2567483615u, 11, 7, 2636928640u, 15, 4022730752u, 18)"
Is that your actual code? "MersenneTwisterEngine(seed)" is not
valid code, you have to provide the template arguments.
In any case, that's a bug. Please file a report for it, and I'll
give it a full fix.
For a local fix, you can replace the incriminating line
(random.d:550):
/// Largest generated value.
enum UIntType max =
w == UIntType.sizeof * 8 ? UIntType.max : (1u << w) - 1;
By:
/// Largest generated value.
enum UIntType max =
UIntType.max >> (UIntType.sizeof * 8 - w);
I think that's all that's required.
PS: If you want to generate longs, you also need to set the "w"
variable (wordSize) from 32 to 64, or you'll still just be
generating 32 bits worth of randomness.
I also recommend you use an alias (and alignment), such as:
alias Mt19937UL =
MersenneTwisterEngine!(ulong, 64, 624, 397, 31,
0x9908b0df, 11, 7,
0x9d2c5680, 15,
0xefc60000, 18);
auto rndEngine = Mt19937UL(seed);
More information about the Digitalmars-d-learn
mailing list