C++随机数

Sim*_*ity 3 c++ random

如下:http://www.fredosaurus.com/notes-cpp/misc/random.html

它提到如果我们想在该范围内生成随机数1-10,我们可以执行以下操作:

r = (rand() % 10) + 1;

我们为什么要添加1?你能解释一下这个过程是如何运作的吗?

并且,关于初始化随机数生成器,它提到了执行以下操作:

srand(time(0));

你能解释一下这个过程吗?而且,如果我们根本没有初始化会发生什么?

谢谢.

Kir*_*rov 11

你添加1,因为你想要随机数1-10,而不是0-9,%如果没有这个,你会想做什么+1.

例如,10 % 10 == 09 % 10 == 9,所以这给你0-9.
添加+1将"移动"此间隔为1-10-> 10 % 10 + 1 == 19 % 10 + 1 == 10


编辑:对不起,忘了你的srand问题. rand()生成相同的数字序列,除非在调用之前调用srand并"种子"具有不同值的随机数生成器rand().因此,这里time(0)使用当前时间为随机数生成器播种,为您提供所有时间的不同值rand()


Fre*_*Foo 9

rand()返回int范围[0,RAND_MAX]中的a.rand() % 10返回int范围为[0,9]的a,因为非负xk最多为k -1.添加1将范围移至[1,10].

(从结果rand() % k保证是均匀分布的,即使你打补丁了,这实在是生成随机数的穷人的方式,不推荐用于生成加密的密钥等.走强RNG库的一部分升压. )

srand(time(0))获取当前时间,希望用户随机执行程序.如果程序在时间tt + 1s执行,则随机数生成器将确保它返回非常不同的结果.如果你不播种它,你每次都可能得到相同的结果.不过,我不确定C标准对此有何看法.在任何情况下,如果您在运行了很长时间的应用程序中播种一次,rand()最终会重复开始.

(这反过来是穷人为RNG播种的方式.在Linux或BSD上,从特殊文件中读取/dev/random以获得"真正的"随机种子.或者,检查您的操作系统是否能以至少微秒的粒度返回时间.)


Cas*_*Cow 6

  • 当您执行"模数"算术时,您会在分割时得到余数.所以rand()给你一个整数,它rand() % 10是一个0到9之间的数字.加1得到一个1到10范围内的数字

  • 随机数生成器将始终生成相同的数字序列,除非您先将它们播种.srand(time(0))"种子"随机生成器,其数量基于当前时间(以秒为单位).理论上说,你将在不同的时间运行它,因此每次都会以不同的方式播种它,因此每次运行程序时都会得到不同的数字序列.