範囲 [0, 2^64) の一様に分散された乱数発生器が与えられた場合、k < 2^64 の範囲 [0, k) の乱数発生器を (GPU 上で) 効率的に構築する方法はありますか?
うまくいかない解決策:
// not uniformly distributed in [0, k)
myRand(rng, k) = rng() % k;
// way too much branching to run efficiently on a gpu
myRand(rng, k) =
uint64_t ret;
while((ret = rng() & (nextPow2(k)-1)) >= k);
return ret;
// only 53 bits of random data, not 64. Also I
// have no idea how to reason about how "uniform"
// this distribution is.
myRand(doubleRng, k) =
double r = doubleRng(); // generates a random number in [0, 1)
return (uint64_t)floor(r*k);
差が十分に小さい場合 (たとえば、1/2^64 以内)、不均一性を妥協しても構わないと思います。