使用arc4random()生成的范围不正确

时间:2013-03-02 18:23:16

标签: objective-c random

这是我的代码:

secretPointX = (arc4random() % 600) + 400;
secretPointY = (arc4random() % 350) + 250;

我使用这些作为坐标,并使用毕达哥拉斯定理将它们用于圆的半径。我的问题是它不会产生400-600和250-350之间的随机数。它会生成指定范围之外的数字。怎么了?

2 个答案:

答案 0 :(得分:4)

Modulo division为您提供剩余的操作。简单地说,当你像这样使用它时,它会给你一个比右手操作数小0到1的数字。您获得的数字最多为599,然后将它们添加到400。

你应该这样做:

u_int32_t max = 600;
u_int32_t min = 400;
u_int32_t result = (arc4random % (max - min) + 1) + min;

或者更好,

arc4random_uniform(max - min + 1) + min;

答案 1 :(得分:3)

您正在生成零(​​包括)和600(不包括)之间的随机数,然后向其添加400。这自然会导致一个介于400和999之间的数字。请使用类似的东西:

secretPointX = (arc4random() % 201) + 400;

您也可以使用arc4random_uniform(201)获取0到200之间的随机数,而无需进行模运算。