确保random()不返回0?

时间:2016-08-30 14:45:36

标签: objective-c random

我正在查看random()的文档:

https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/srandomdev.3.html#//apple_ref/c/func/random

它返回0到(2 ** 31)-1范围内的连续伪随机数。

我不希望它永远返回0。

我正在考虑写作:

long rand = random() + 1;

但是如果我没弄错的话,32位处理器上的长度可能是32位。我想我会冒险堆栈溢出。

获得1到(2 ** 31)-1之间的随机数的最佳方法是什么?

3 个答案:

答案 0 :(得分:5)

NSUInteger r = arc4random_uniform(N) + 1;

这将生成介于1和N之间的数字。arc4random_uniform(N)生成介于0和N-1之间的数字。

你应该没有溢出问题。

答案 1 :(得分:2)

long rand = 0;
while (rand == 0) {
    rand = random();
}

这几乎绝对肯定会运行一次。在非常非常罕见的情况下(永远不会发生),它会运行两次。

(请注意,这只是arc4random_uniform工作原理的简化版本。如果您可以使用该功能,正如杰夫所建议的那样,您应该这样做。)

答案 2 :(得分:1)

random()返回的最大值为RAND_MAX,因此您可以这样做:

long rand = 1 + (random() % RAND_MAX);

random()返回零到RAND_MAX-1之间的值时,您可以通过添加1来抵消它。当random()完全返回RAND_MAX时,模运算符%会将结果转换为零,因此rand将再次为1

这种方法的缺点是获得1的概率大约是获得任何其他数字的两倍。