我正在查看random()的文档:
它返回0到(2 ** 31)-1范围内的连续伪随机数。
我不希望它永远返回0。
我正在考虑写作:
long rand = random() + 1;
但是如果我没弄错的话,32位处理器上的长度可能是32位。我想我会冒险堆栈溢出。
获得1到(2 ** 31)-1之间的随机数的最佳方法是什么?
答案 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
的概率大约是获得任何其他数字的两倍。