引子

相信大家对于rand()函数并不陌生,我们常用它来生成伪随机数,但是为什么有时候我们生成的随机数并不符合预期呢?或者说,为什么有时候我们生成的随机数并不随机?如何有效地生成伪随机数呢?

rand()

rand()函数是使用线性同余法做的,它并不是真的随机数,因为其周期特别长,所以在一定范围内可以看成随机的。
        rand()函数不需要参数,它将会返回0到RAND_MAX之间的任意的整数。如果我们想要生成一个在区间[0, 1]之内的数,那么我们可以写出如下代码:

rand_num = rand()/RAND_MAX;

现在我们之内运行如下代码来生成10个随机数:

for(int i = 0; i < 10; i++)
{cout << rand() << endl;
}

多次运行结果如图:

通常来说,这并不是我们所期望的结果,下面我们来看看如何使用srand()函数正确地实现伪随机数生成。

srand()

srand()为初始化随机数发生器,用于设置rand()产生随机数时的种子。传入的参数seed为unsigned int类型,通常我们会使用time(0)或time(NULL)的返回值作为seed。下面我们来进行实验,从而对它进行更深入的感知。

srand(1);
for(int i = 0; i < 10; i++)
{cout << rand() << endl;
}
  • 时我们得到的结果为:

从图中来看,这与我们前面不使用srand()设置随机种子时结果一致,因此我们可以看出,如果我们不显示调用srand()的话,将默认为srand(1)。此外,从这次实验中可以看出,如果我们设置某个固定的seed,那么虽然在同一次运行时,会有不同的随机数产生,但是对于这段程序的多次运行所得到的结果是不变的。
        那我们如何引入变化的种子呢?一般来说,我们会使用time(NULL)或time(0)来表示变化的种子,time(0)的返回的是从1970 UTC Jan 1 00:00到当前时刻的秒数,为unsigned int类型。当我们在不同时刻运行程序时,就会有不同的随机数种子,因此就可以得到不同的结果:

srand(time(0));
for(int i = 0; i < 10; i++)
{cout << rand() << endl;
}

这段代码的运行结果为:

值得注意的是,如果,我们两次程序运行之间的间隔小于1s,那么会出现下面这种情形(我们通过在代码中两次调用srand(time(0))来模仿这种情形):

srand(time(0));
for(int i = 0; i < 10; i++)
{cout << rand() << endl;
}
cout << "--------------" << endl;
srand(time(0));
for(int i = 0; i < 10; i++)
{cout << rand() << endl;
}

运行结果:

从图中来看,两次运行结果一致,这是为什么呢?因为我们两次调用srand()函数设置随机数种子之间的时间间隔不超过1s,这会导致我们重置随机数种子,从而等价于使用了一个固定的随机数种子。我们可以用下面的代码来进行验证:

srand(time(0));
for(int i = 0; i < 10; i++)
{cout << rand() << endl;
}
cout << "--------------" << endl;
sleep(1.0);
srand(time(0));
for(int i = 0; i < 10; i++)
{cout << rand() << endl;
}

此时我们得到的结果为:

为什么要特意指出这一点?这是为了防止我们不小心将srand(time(0))放入了随机数生成循环中:

for(int i = 0; i < 10; i++)
{srand(time(0));cout << rand() << endl;
}

我们得到的结果为:

如果,我们在其中引入sleep(1.0),那么将没有问题:

for(int i = 0; i < 10; i++)
{srand(time(0));cout << rand() << endl;sleep(1.0);
}

输出结果为:

总结

综上所述,正确的用法是:

srand(time(0));
for(int i = 0; i < 10; i++)
{cout << rand() << endl;
}

而且,两次程序执行的时间间隔要大于1s,如果我们是要在某个类中定义随机数生成函数,那么可以将srand()放在构造函数中。

随机数函数rand()和srand()的区别相关推荐

  1. 【C语言】随机数函数rand和srand

    文章目录 一.随机数函数 1.rand().srand() 2.time() 二.案例实现 1.案例描述 2.代码实现 一.随机数函数 1.rand().srand() C语言产生随机数要用到的函数是 ...

  2. php随机整数rand和mt_rand,PHP随机数函数rand()与mt_rand()的讲解

    PHP随机数函数rand()与mt_rand()的讲解 PHP中rand()与mt_rand()都是用于产生一个指定范围内单独随机数的函数,如果需要产生多个不重复的随机数,请参考:PHP生成指定范围内 ...

  3. C++产生随机数函数rand()

    C++产生随机数函数rand() C++11之前没有random,生成随机数用rand(),可以配合srand()来使用.rand()不是真正的生成随机数,而是线性取余,有可能也会生成相同的数出来.生 ...

  4. sqlserⅴer随机函数_SQL server的随机数函数rand()详解

    SQL server的随机数函数rand()详解 from:http://tieba.baidu.com/f?kz=607363268 在SQL Server中,有个随机函数rand(),有不少新手可 ...

  5. mysql 列 随机数_MySQL的指定范围随机数函数rand()的使用技巧

    公式如下: rand() * (y-x) + x 咱们学php的都知道,随机函数rand或mt_rand,可以传入一个参数,产生0到参数之间的随机整数,也可以传入两个参数,产生这两个参数之间的随机整数 ...

  6. c mysql生成随机数函数,MySQL的指定范围随机数函数rand()的使用技巧

    公式如下: rand() * (y-x) + x 咱们学php的都知道,随机函数rand或mt_rand,可以传入一个参数,产生0到参数之间的随机整数,也可以传入两个参数,产生这两个参数之间的随机整数 ...

  7. MySQL集函数随机数_MySQL的指定范围随机数函数rand()的使用技巧

    公式如下: rand() * (y-x) + x 咱们学php的都知道,随机函数rand或mt_rand,可以传入一个参数,产生0到参数之间的随机整数,也可以传入两个参数,产生这两个参数之间的随机整数 ...

  8. php 随机数rand,PHP随机数函数rand()与mt_rand() - 米扑博客

    PHP 中 rand()与mt_rand()都是用于产生一个指定范围内单独随机数的函数,如果需要产生多个不重复的随机数,请参考:PHP生成指定范围内的N个不重复的随机数. 既然他们都是用于产生一个随机 ...

  9. php随机整数函数,PHP随机数函数rand()与mt_rand()

    PHP中rand()与mt_rand()都是用于产生一个指定范围内单独随机数的函数,如果需要产生多个不重复的随机数,请参考:php生成指定范围内的N个不重复的随机数. 既然他们都是用于产生一个随机数, ...

最新文章

  1. CVPR 2019论文阅读:Libra R-CNN如何解决不平衡对检测性能的影响?
  2. java 运行环境变量,java运行环境 和 环境变量的配置
  3. 使用OpenCV进行人脸关键点检测
  4. jQuery+css模拟下拉框模糊搜索的实现
  5. centos7不能安装mysql数据库_Centos7 上安装mysql遇上的问题:mysql无法正常启动-Go语言中文社区...
  6. 使用Git工具生成公钥与私钥
  7. 世界正在走向实时化,谈谈Twitter对流处理的理解与思考
  8. 全国计算机等级考试题库二级C操作题100套(第99套)
  9. 移动端h5监听浏览器返回操作(目前在react项目中用到)
  10. 中职学校计算机教学背景,创新网络背景下中职院校计算机教学模式探析
  11. 如果战斗机飞行员弹出,自动驾驶仪会接管飞机安全降落么?
  12. windows 2008 R2操作系统上使用iis服务运行php和mysql数据库的网站遇到的验证码不显示问题?...
  13. MySQL存个人信息可以吗_mysql数据库中,在修改数据时能否保存操作人员的信息,比如姓名或id,如果能,怎么操作。...
  14. 计算机内图片怎么自定义排序,win10系统设置图片文件自定义排序的图文教程
  15. 智能系统概论——初识百度AI平台
  16. 论站长赚钱之七剑下天山
  17. 负整数的取模与取整的问题
  18. iOS 各种手势用法
  19. 打造铁军团队(王牌军)的核心三点
  20. linux桌面系统 5种经典的Linux桌面系统

热门文章

  1. Android源码下载(官方版)
  2. 用C++实现中国象棋
  3. 民宿OTA运营有哪些指标数据最重要
  4. java 获取两个时间差_java如何获取两个日期的时间差
  5. 协变量偏移_恶意软件分类的协变量偏移
  6. 点云PCD和PLY区别
  7. 超越Framer的基础知识
  8. C 语言中负数移位运算讲解
  9. 如何实现‘请在微信客户端打开链接’
  10. MQTT网关连接华为云物联网平台应用