Objective-C:模偏差

Ala*_*lan 13 random objective-c

使用:

value = arc4random() % x
Run Code Online (Sandbox Code Playgroud)

如何避免或消除模偏差?

至少根据维基百科的说法,在编程机会游戏时,模偏差是一个问题.

小智 49

使用arc4random_uniform(x).这适合你.

根据手册页:

arc4random_uniform()将返回一个小于的均匀分布的随机数upper_bound.arc4random_uniform()建议使用结构,arc4random() % upper_bound因为当上限不是2的幂时,它避免了"模偏差".

  • 这个答案比接受的答案要好. (5认同)

Can*_*der 14

arc4random返回一个32位无符号整数(0到2 32 -1).

对于足够小的x,可能没有明显的模偏差.但是,如果您想要确定,请执行以下操作:

Y = 2 p,其中2 P-1 <X≤2 p

val = arc4random() % y;
while(val >= x)
    val = arc4random() % y;
Run Code Online (Sandbox Code Playgroud)

  • 我碰巧遇到了相同的任务,可以在[src/sys/dev/rnd.c]的OpenBSD`arc4random_uniform()`中找到C实现(http://www.openbsd.org/cgi-bin/cvsweb/src /sys/dev/rnd.c?rev=1.140;content-type=text%2Fplain) (3认同)