kod*_*oda 2 c++ random math distribution modulo
从各种其他SO问题中读取,当使用rand()%N时,您可能会修改您获得的伪数的偏差,因此您通常必须引入一些范围处理.
但是在所有情况下总是提到rand(),而不是较新的random()或arcrandom4()函数或本机C++ 11方法.当你在一组上运行这些例程时会发生什么?你有像rand()那样的偏见吗?
谢谢.
以下答案没有像Eric Lippert关于同一主题的博客文章那样详细.此外,这个问题及其答案涉及同一主题.
来自做的大部分偏见rand() % N
不是来自rand()
部分 - 它来自% N
部分.
让我们考虑一个rand()的'良好'实现,它生成0到100之间的所有数字(为简单起见),概率相等 - 均匀分布.接下来让我们说我们想使用rand()的这个实现来生成0到80之间的随机数,所以我们这样做rand() % 80
.让我们分解接下来会发生什么的可能性:
这意味着有两种方法可以得到一个从0到20的数字,但只有一种方法可以得到一个从21到79的数字.从0到20 的数字比从21到79的数字更有可能这通常不是理想的财产.
将N均值划分为rand()的最大值的任何N值都不会出现此问题,因为生成任何值的方法都相同.此外,对于小的N值,偏差要小于对于接近rand()的最大值的N值的偏差.
那么,rand()以外的函数呢? 如果它们从某个固定范围返回值并且您执行mod操作,它们将遭受相同的偏差.如果您正在调用一个以范围作为参数的随机函数,那么您不需要执行mod操作.该函数可能会在内部处理任何偏差.