在以下位置:http://www.fredosaurus.com/notes-cpp/misc/random.html
它提到,如果我们想要在1-10
范围内生成一个随机数,我们可以执行以下操作:
r = (rand() % 10) + 1;
为什么我们要添加1
?你能解释一下这个过程是如何工作的吗?
并且,关于初始化随机数生成器,它提到了执行以下操作:
srand(time(0));
你能解释一下这个过程吗?而且,如果我们根本不初始化会发生什么呢?
谢谢。
发布于 2011-02-03 19:11:06
您添加1,因为您需要随机数1-10,而不是0-9,如果没有+1
,%
会做什么?
例如,10 % 10 == 0
和9 % 10 == 9
,所以这会给你0-9。
添加+1
会将此间隔“移动”到1-10-> 10 % 10 + 1 == 1
和9 % 10 + 1 == 10
编辑:对不起,我忘了你的问题了。rand()
生成相同的数字序列,除非您调用srand
并在调用rand()
之前用不同的值“播种”随机数生成器。因此,在这里,time(0)
用当前时间作为随机数生成器的种子,它为您提供了不同的值,您可以调用rand()
发布于 2011-02-03 19:11:39
rand()
返回范围为0,RAND_MAX
的int
。rand() % 10
返回0,9范围内的int
,因为非负x模k至多是k-1。添加1会将范围移动到1,10。
(来自rand() % k
的结果是而不是保证是uniformly distributed的。即使你修补了它,这也是一个可怜的人生成随机数的方式,不推荐用来生成加密密钥等。更强大的RNG库是Boost的一部分。)
srand(time(0))
采用当前时间,希望用户在随机时间执行程序。如果程序在时间t和t+ 1s执行,随机数生成器将确保返回完全不同的结果。如果你不播种,你可能每次都会得到相同的结果。不过,我不确定C标准对此有什么说法。在任何情况下,如果您在一个长时间运行的应用程序中播种一次,rand()
最终会开始重复它自己。
(这反过来又是穷人播种RNG的方式。在Linux或BSD上,从特殊文件/dev/random
中读取以获得“真正的”随机种子。或者,检查您的操作系统是否能够以至少微秒的粒度返回时间。)
发布于 2011-02-03 19:14:10
rand()
会给出一个整数,而rand() % 10
是一个介于0和9之间的数字。加1可以得到1到10范围内的数字。srand(time(0))
根据当前时间(以秒为单位)向随机生成器“播种”一个数字。原理是你会在不同的时间运行它,因此每次都会有不同的种子,因此每次运行程序时,你会得到不同的数字序列。https://stackoverflow.com/questions/4885367
复制相似问题