On Sat, 3 Jul 2021 at 08:06, Fabien COELHO <coe...@cri.ensmp.fr> wrote: > > Here is a v4, which: > > - 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. 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. So what you've just invented is an algorithm with the complexity of the unbiased bitmask method, but basically the same bias as the biased integer multiply method. 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. 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. Otherwise, I'm happy with the use of the bitmask method, as long as it's implemented correctly. Regards, Dean