这个随机函数有什么问题?

时间:2009-07-15 12:29:34

标签: iphone objective-c cocoa-touch uikit

我给它0和400,它有时返回400以上的值。这没有意义。

- (float)randomValueBetween:(float)low andValue:(float)high {
    return (((float) arc4random() / RAND_MAX) * (high - low)) + low;
}

这实际上是我在网上发现的一个片段。也许有人可以看到那里的错误?

4 个答案:

答案 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操作,为什么不直接在感兴趣的范围内进行操作?

另外,如果你只输入一些数字,你为什么要通过花车(并返回花车)?整数更有效率。