Objective c 目标C:模偏差

Objective c 目标C:模偏差,objective-c,random,Objective C,Random,使用: 如何避免或消除模偏差 至少根据维基百科的说法,在编写机会游戏时,模偏差是一个问题。arc4random返回一个32位无符号整数(0到232-1) 对于足够小的x,可能不会有明显的模偏差。但是,如果您想真正确定,请执行以下操作: y=2p,其中2p-1=maxValue){//循环直到我们得到0为止≤ 值=maxValue){//循环直到我们得到0为止≤ 值中可以找到C实现。考虑重新标记Zoidberg的答案是正确的,因为它是根据ARC4RAPIVE()的作者的规范正确答案。 u_int3

使用:

如何避免或消除模偏差


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

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

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

y=2p,其中2p-1
如果
arc4random
mod
x
的最大值大于
x
,忽略大于最大
arc4random max mod x
的任何值,再次调用
arc4random

u_int32_t maxValue=~(u_int32_t)0);//等于0xffff。。。
val = arc4random() % y;
while(val >= x)
    val = arc4random() % y;
maxValue-=maxValue%x;//将maxValue设为x的倍数 而((value=arc4random())>=maxValue){//循环直到我们得到0为止≤ 值<最大值 } 值%=x;
尽管除非您使用的是一百万(或更多)以下的任何x,否则我不会担心它

u_int32_t maxValue=~(u_int32_t)0);//等于0xffff。。。
u_int32_t maxValue = ~((u_int32_t) 0);      // equal to 0xffff...
maxValue -= maxValue % x;                   // make maxValue a multiple of x
while((value = arc4random()) >= maxValue) { // loop until we get 0 ≤ value < maxValue
}
value %= x;
maxValue-=maxValue%x;//将maxValue设为x的倍数 而((value=arc4random())>=maxValue){//循环直到我们得到0为止≤ 值<最大值 } 值%=x;
有点迂腐地反对科巴的回答。它“起作用”,也就是说它消除了模偏差,但它拒绝了比需要更多的值。最极端的情况是x=2^31。此处应接受arc4random()的所有值,但编写的代码将拒绝其中的一半


相反,在maxValue的初始化中添加1(将其设置为2^32,因此必须使用64位int),然后它就正确了。您也可以避免使用64位int。如果2^32%x==0,则事先进行测试,如果可以接受,则所有arc4random()值都可以接受,您可以跳过循环,否则可以通过在初始化时减去2^32%x将maxValue保持在32位。

使用
arc4random\u uniform(x)
。这是给你的

根据手册页:

arc4random\u uniform()
将返回小于
上限的均匀分布随机数
arc4random_uniform()
推荐用于
arc4random()%上限
等构造,因为当上限不是二的幂时,它避免了“模偏差”


如果我记得,在Python的随机数生成器中有这样的事情。我碰巧在同一个任务上跳过,在OpenBSD <代码> ARC4RAPIVILIVION SUMER()/代码>中可以找到C实现。考虑重新标记Zoidberg的答案是正确的,因为它是根据ARC4RAPIVE()的作者的规范正确答案。
u_int32_t maxValue = ~((u_int32_t) 0);      // equal to 0xffff...
maxValue -= maxValue % x;                   // make maxValue a multiple of x
while((value = arc4random()) >= maxValue) { // loop until we get 0 ≤ value < maxValue
}
value %= x;
u_int32_t maxValue = ~((u_int32_t) 0);      // equal to 0xffff...
maxValue -= maxValue % x;                   // make maxValue a multiple of x
while((value = arc4random()) >= maxValue) { // loop until we get 0 ≤ value < maxValue
}
value %= x;