【发布时间】:2013-06-13 16:43:41
【问题描述】:
给定一个在 [0, 2^64) 范围内均匀分布的随机数生成器,是否有任何有效的方法(在 GPU 上)为一些 k
一些不起作用的解决方案:
// 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 以内),我愿意妥协不均匀性。
【问题讨论】:
-
@isti_spl 我不是在寻找二进制向量。我正在寻找 [0, k) 范围内的数字。
-
如果你有一个提供统一随机分布的 rng(n)。在 [0, n-1] 中,那么 rng(n)%k 不是均匀分布的?你需要它们有多“统一”?也许运行一些测试来查看结果分布?
-
不是。考虑一下你有一个 2 位 RNG 并且你需要一个在 [0, 3) 范围内的数字的情况。使用 64 位 RNG 会遇到同样的危险。