Hello Dean,
- moves the stuff to common and fully removes random/srandom (Tom)
- includes a range generation function based on the bitmask method (Dean)
but iterates with splitmix so that the state always advances once (Me)
At the risk of repeating myself: do *not* invent your own scheme.
The problem with iterating using splitmix is that splitmix is a simple
shuffling function that takes a single input and returns a mutated
output depending only on that input.
It also iterates over its 64 bits state in a round robin fashion so that
the cycle size is 2^64 (it is a simple add).
So let's say for simplicity that you're generating numbers in the range
[0,N) with N=2^64-n and n<2^63. Each of the n values in [N,2^64) that
lie outside the range wanted are just mapped in a deterministic way back
onto (at most) n values in the range [0,N), making those n values twice
as likely to be chosen as the other N-n values.
I do understand your point. If the value is outside the range, splitmix
iterates over its seed and the extraction functions produces a new number
which is tested again. I do not understand the "mapped back onto" part,
the out of range value is just discarded and the loops starts over with a
new derivation, and why it would imply that some values are more likely to
come out.
So what you've just invented is an algorithm with the complexity of the
unbiased bitmask method,
That is what I am trying to implement.
but basically the same bias as the biased integer multiply method.
I did not understand.
I don't understand why you object to advancing the state more than
once. Doing so doesn't make the resulting sequence of numbers any less
deterministic.
It does, somehow, hence my struggle to try to avoid it.
call seed(0xdeadbeef);
x1 = somepseudorand();
x2 = somepseudorand();
x3 = somepsuedorand();
I think we should want x3 to be the same result whatever the previous
calls to the API.
In fact, I'm pretty sure you *have to* advance the state more than
once in *any* unbiased scheme. That's a common characteristic of all
the unbiased methods I've seen, and intuitively, I think it has to be
so.
Yes and no. We can advance another state seeded by the root prng.
Otherwise, I'm happy with the use of the bitmask method, as long as
it's implemented correctly.
I did not understand why it is not correct.
--
Fabien.