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

Tha*_*nks 5 iphone cocoa-touch objective-c uikit

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

- (float)randomValueBetween:(float)low andValue:(float)high {
    return (((float) arc4random() / RAND_MAX) * (high - low)) + low;
}
Run Code Online (Sandbox Code Playgroud)

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

Nol*_*rin 7

手动页面arc4random表示返回的值可以在有效范围内的任何地方u int32(即0 to (2**32)-1).这意味着你想要除以0xFFFFFFFF,而不是RAND_MAX我想象的更少(但它依赖于库,所以你必须确切地检查它是什么).

因此你的功能应该变成:

- (float)randomValueBetween:(float)low andValue:(float)high {
    return (((float) arc4random() / 0xFFFFFFFFu) * (high - low)) + low;
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ton 6

  • arc4random 返回从0到(2 ^ 32 - 1)的伪随机值
  • RAND_MAX 默认值为(2 ^ 31 - 1)

因此,对于范围内的随机值,函数可能将(high - low)范围乘以系数.20 - 800