首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++随机数

C++随机数
EN

Stack Overflow用户
提问于 2011-02-03 19:08:34
回答 7查看 11.9K关注 0票数 3

在以下位置:http://www.fredosaurus.com/notes-cpp/misc/random.html

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

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

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

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

srand(time(0));

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

谢谢。

EN

回答 7

Stack Overflow用户

发布于 2011-02-03 19:11:06

您添加1,因为您需要随机数1-10,而不是0-9,如果没有+1%会做什么?

例如,10 % 10 == 09 % 10 == 9,所以这会给你0-9。

添加+1会将此间隔“移动”到1-10-> 10 % 10 + 1 == 19 % 10 + 1 == 10

编辑:对不起,我忘了你的问题了。rand()生成相同的数字序列,除非您调用srand并在调用rand()之前用不同的值“播种”随机数生成器。因此,在这里,time(0)用当前时间作为随机数生成器的种子,它为您提供了不同的值,您可以调用rand()

票数 11
EN

Stack Overflow用户

发布于 2011-02-03 19:11:39

rand()返回范围为0,RAND_MAXintrand() % 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中读取以获得“真正的”随机种子。或者,检查您的操作系统是否能够以至少微秒的粒度返回时间。)

票数 9
EN

Stack Overflow用户

发布于 2011-02-03 19:14:10

  • 当你执行“模”运算时,你得到除法时的余数。因此,rand()会给出一个整数,而rand() % 10是一个介于0和9之间的数字。加1可以得到1到10范围内的数字。
  • 随机数生成器将始终生成相同的数字序列,除非您首先对它们进行播种。srand(time(0))根据当前时间(以秒为单位)向随机生成器“播种”一个数字。原理是你会在不同的时间运行它,因此每次都会有不同的种子,因此每次运行程序时,你会得到不同的数字序列。
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4885367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档