2011-02-03 91 views
3

在以下几点:http://www.fredosaurus.com/notes-cpp/misc/random.htmlC++的随机数

它提到,如果我们要生成范围内1-10一个随机数,我们可以做到以下几点:

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

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

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

srand(time(0));

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

谢谢。

+0

模(``%)10给出在`范围0-9`结果,因此`+ 1` – davka 2011-02-03 11:11:22

+1

使用`兰特()%k`只是普通不好的建议。对fredosaurus感到羞耻。 – 2011-02-03 11:24:51

回答

3

随机而不++ 1将使在用C 0-9状阵列的范围内的随机数从0到n,这里相同。非常第一个数字是0,所以得到1-10你添加最小值(1)。

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()

4

为什么我们加1?

当您将一个数字除以10时,余数将介于0-9之间。所以,要改变这个,我们加1。

9

rand()返回范围[0,RAND_MAX]范围内的intrand() % 10在范围[0,9]返回int因为非负Xķ为至多ķ -1。加1会将范围移至[1,10]。

(从rand() % k的结果保证是uniformly distributed。即使你打补丁了,这实在是产生推荐用于生成加密的密钥等的随机数,而不是穷人的方式。更强的RNG图书馆是Boost的一部分。)

srand(time(0))以当前时间,用户执行在随机时间节目的希望。如果程序在时间tt + 1s执行,随机数发生器将确保它返回非常不同的结果。如果你不种它,你每次都可能得到相同的结果。不过,我不确定C标准对此有何评论。无论如何,如果您在运行很长时间的应用程序中播种一次,最终会开始重复。

(这又是无欲无求的RNG的穷人的方式。在Linux或BSD,从特殊文件/dev/random读得到“真正的”随机种子。另外,请检查您的操作系统可以与返回的时间至少微秒粒度。)

6
  • 当执行分割时,“模”运算你得到的余数。所以rand()给你一个整数,rand() % 10是0到9之间的数字加1的范围为1〜得到一个数字,以10个

  • 随机数生成器总是会产生相同的数字序列,除非你第一种子它们。 srand(time(0))“根据当前时间以秒为单位”随机产生“一个数字。理论是,你将在不同的时间运行它,因此每次播种都会有所不同,因此每次运行程序时都会得到不同的数字序列。

2

模数部分由其他人回答。您必须使用srand(time(0))进行初始化,否则每次运行程序时都会得到相同的一系列随机数。

据我了解,这是因为产生了一定数量的开始,下面的数字是基于这样的出发数量来计算。

你可以用你喜欢的任何数量的初始化,例如,用于测试你可以使用函数srand(0),并得到了相同的数字在过去的运行。要得到一个完全随机的序列,你需要使用时间(0),因为它初始化的实际时间以秒为单位,对于大多数目的来说足够随机。

1

关于srand()函数,一个项目,我不认为已经解释 - 对于一个给定的种子,你总是会得到相同的随机序列(不只是函数srand(0))。因为时间(0)函数每秒都在变化,所以种子从运行到运行不可能是相同的,这就是为什么它经常与srand()一起使用的原因。

将随机数发生器想象成具有单一输入的复杂数学表达式。每次调用它时,它都会使用先前的输出作为输入来生成下一个数字。结果是可以预测的,如果你的输入是5,而你得到10次,那么下次你也会得到它。所以除非你想在每次运行中使用相同的随机序列(有时不是坏事!),你想要将第一个输入(种子)设置为某种(某种程度上)随机的,比如当前时间。

警告:随机数生成器在内部使用一个大得多的数目大于一个它们输出,以便将“5让你10”的例子中的输入/输出关系是通常不那么简单。但这个想法是一样的。