我给它0和400,它有时返回400以上的值。这没有意义。
- (float)randomValueBetween:(float)low andValue:(float)high {
return (((float) arc4random() / RAND_MAX) * (high - low)) + low;
}
这实际上是我在网上发现的一个片段。也许有人可以看到那里的错误?
答案 0 :(得分:7)
manual page for arc4random
表示返回的值可以是u int32
有效范围内的任何位置(即0 to (2**32)-1
)。这意味着你要除以0xFFFFFFFF
,而不是RAND_MAX
,我认为它更少(但它依赖于库,所以你必须确切地检查它是什么)。< / p>
你的功能应该成为:
- (float)randomValueBetween:(float)low andValue:(float)high {
return (((float) arc4random() / 0xFFFFFFFFu) * (high - low)) + low;
}
答案 1 :(得分:6)
arc4random
将伪随机值从零返回到(2 ^ 32 - 1)RAND_MAX
的默认值为(2 ^ 31 - 1)因此对于范围(high - low)
中的随机值,函数可能会将2
范围乘以0 - 800
因子。
答案 2 :(得分:3)
在iPhone上,RAND_MAX为0x7fffffff(2147483647),而arc4random()将返回最大值0x100000000,因此(4294967296)/(2147483647)= 2 ..... 2 *(400-0)+ 0 = 800!方法可以返回的最大值
答案 3 :(得分:0)
更简单的变体是:
- (float)randomValueBetween:(float)low andValue:(float)high {
return (arc4random() % * (high - low)) + low;
}
既然您已经在进行mod操作,为什么不直接在感兴趣的范围内进行操作?
另外,如果你只输入一些数字,你为什么要通过花车(并返回花车)?整数更有效率。