【发布时间】:2020-04-08 18:49:56
【问题描述】:
我正在尝试消化以下帖子 https://www.pcg-random.org/posts/bounded-rands.html 关于无偏见、高效的随机数生成。
这是描述经典模数方法的摘录。
uint32_t bounded_rand(rng_t& rng, uint32_t range) {
return rng() % range;
}
但除了慢之外,还有偏颇。了解为什么 rand() % 52 产生有偏差的数字,如果我们假设 rand() 产生 [0..2^32) 范围内的数字,观察到 52 并不完美 除以 2^32,它将它除以 82,595,524 次,余数为 48。含义 如果我们使用 rand() % 52,将有 82,595,525 种选择方式 我们 52 张牌中的前 48 张牌,只有 82,595,524 种方式 选择最后四张牌。换句话说,有一个 0.00000121% 对最后四张牌的偏见......
这篇文章继续展示了另一种技术,该技术使用浮点算法从本质上生成所需范围的随机分数并将其截断为整数。
static uint32_t bounded_rand(rng_t& rng, uint32_t range) {
double zeroone = 0x1.0p-32 * rng();
return range * zeroone;
}
这种方法与经典的模方法一样有偏见,但是 偏见以不同的方式表现出来。例如,如果我们是 选择 [0..52) 范围内的数字,数字 0、13、26 和 39 会比其他人少出现一次。
最后一段让我感到困惑。我不太精通浮点算术,所以我很难在取模方法中的偏差和浮点方法中的偏差之间建立联系。我所看到的是,在这两种技术中,有 4 个数字是有偏见的。
【问题讨论】:
标签: random