C++中没有自带的random函数,要生成随机数就需要用c文件"stdlib.h"里的函数rand()和srand(),不过,由于rand()的内部实现是用线性同余法做的,

所以生成的并不是真正的随机数,而是在一定范围内可看为随机的伪随机数,下面分别介绍一下各自的用法

1. int rand(void);它是无参函数,返回int型数据,并且返回值范围是 0~RAND_MAX(32767),RAND_MAX定义在头文件 <cstdlib>中,是一个8位数;

rand()的作用是用来产生随机数序列的,它产生的随机数是根据种子生成的,不同的种子产生的随机序列也是不同的;而系统默认的种子是1,如果

你没有设置种子的话,那每次使用rand()产生的随机序列都是固定的,它会产生相同的随机序列,所以这不是真正的随机,而是伪随机数,要做到真正

的随机,就要使种子随机。下面先说一下rand()的用法,后面再说怎么设置随机种子,上代码

#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
int main()
{
cout<<"第一次产生的随机序列:";
for(int i=;i<=;i++)
cout<<rand()<<" ";
cout<<"\n";
return ;
}

我运行了两次程序,分别产生了两个随机序列,如图

你会发现两次所生成的随机序列是相同的,这是为啥 ?上面说过系统默认的种子是1,而你又没有设置随机种子,所以每次产生的随机序列都是一样的,是伪随机。

如何解决这个伪随机的问题呢,这就引出了srand()。

2. void srand(unsigned int seed);srand()就是用来设置rand()函数的种子的,若srand()每次设置的种子不同,那么rand()就会产生不同的随机序列。一般用时间来

做种子,因为时间一直在变,这样种子就会不同,从而可以产生真正的随机数。方法为将函数time(0)作为srand()的参数(因为time会有返回值,实际上是让这个返回值做参数),

另外srand(time(0))只需要执行一次就行了。具体操作还是看代码吧

#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
int main()
{
srand((int)time()); //用时间做种子
cout<<"第2次产生的随机序列:";
for(int i=;i<=;i++)
cout<<rand()<<" ";
cout<<"\n";
return ;
}

还是运行了两次程序,分别产生了两个随机序列,结果如下图

那你会发现这两次产生的两个随机序列是不一样的,因为用了时间做种子。下面还有一个小问题,就是如果要产生某个范围内的随机数要怎么实现呢,比如

要产生[0,100)这个范围内的随机数,或者[0,10000)这个范围内的随机数,就要用rand()%n来产生[0,n)这个范围内的随机数了。用rand()%(b-a)+a 来产生[a,b)

这一范围内的随机数,下面用程序分别模拟一下这三种情况:

#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
int main()
{
srand((int)time()); //用时间做种子
cout<<"产生[0,100)内的随机数:";
for(int i=;i<=;i++)
cout<<rand()%<<" ";
cout<<"\n";
cout<<"产生[0,10000)内的随机数:";
for(int i=;i<=;i++)
cout<<rand()%<<" ";
cout<<"\n";
cout<<"产生[100000,1000000)内的随机数:";
for(int i=;i<=;i++)
cout<<rand()%(-)+<<" ";
return ;
}

结果如下图:

通过上面的操作就可以产生指定范围内的随机数了。

产生一定范围内的随机数的公式是:

要产生 [0,n) 内的随机数,用 rand()%n

要产生 [a,b) 内的随机数,用 rand()%(b-a)+a

要产生 [a,b] 内的随机数,用 rand()%(b-a+1)+a

要产生 (a,b] 内的随机数,用 rand()%(b-a)+a+1

通用公式为:a + rand() % n;其中的a是起始值,n是整数的范围,就是a~n之间的随机数。

参考:https://www.cnblogs.com/VVingerfly/p/5990714.html

https://www.cnblogs.com/xiaokang01/p/9786751.html#_label0_2

c++<cstdlib>文件中的函数产生随机数的更多相关文章

  1. 在.bashrc文件中定义函数

    在命令行上直接定义shell函数的明显缺点是当退出shell时,函数就消失了,对于复杂的函数来说,这可能会是个问题. 一个简单的方法就是每次启动新shell的时候都会自动加载所需要的函数. 最好的办法 ...

  2. VS2013 VC++的.cpp文件调用CUDA的.cu文件中的函数

    CUDA 8.0在函数的调用中方便的让人感动.以下是从网上学到的VC++的.cpp文件调用CUDA的.cu文件中的函数方法,和一般的VC++函数调用的方法基本没差别. 使用的CUDA版本为CUDA 8 ...

  3. Python 调用JS文件中的函数

    Python 调用JS文件中的函数 1.安装PyExecJS第三方库 2.导入库:import execjs 3.调用JS文件中的方法 Passwd = execjs.compile(open(r&q ...

  4. shell 从函数文件中调用函数的方法

    你可以把所有的函数存储在一个函数文件中 你可以把所有的文件函数加载到当前脚本或命令行 加载函数文件中所有函数的方法: source xxx.sh

  5. nm 命令能够显示目标文件中重载函数的名字改变(C++)

    #include <stdio.h> #include <iostream> using std::cout; using std::endl; //这里的两个不同的add函数 ...

  6. C++学习——在C文件中调用C++文件中的函数

    1.CPP文件中的内容 #include "mytest.h" #include <iostream> using namespace std; int add(con ...

  7. [C 语言基础] 如何调用不同文件中的函数

    很多时候需要将实现不同功能的函数或者与某个模块有关的函数写在一个文件里.这样有两个好处: 1. 方便以后调用:以后需要用到这个模块,或者这类函数,直接将相关文件复制过去,再稍微修改一下就能应用于不同场 ...

  8. Pycharm:如果想验证一个文件中的函数

    在该文件的函数后写上两句 def test(): pass if __name__='__main__': test() 这样就可以执行该函数 如果只是在其他文件中导入了该函数,则不会执行最后两段话, ...

  9. nodejs中引用其他js文件中的函数

    基本语句 require('js文件路径'); 使用方法 举个例子,在同一个目录下,有app.fun1.fun2三个js文件. 1. app.js var fun1 = require('./fun1 ...

随机推荐

  1. ConcurrentHashMap1.7和1.8的源码分析比较

    ConcurrentHashMap 在多线程环境下,使用HashMap进行put操作时存在丢失数据的情况,为了避免这种bug的隐患,强烈建议使用ConcurrentHashMap代替HashMap,为 ...

  2. B 方块消消乐

    时间限制 : - MS   空间限制 : - KB  评测说明 : 1s,128m 问题描述 何老板在玩一款消消乐游戏,游戏虽然简单,何老板仍旧乐此不疲.游戏一开始有n个边长为1的方块叠成一个高为n的 ...

  3. 玩转控件:对Dev的GridControl控件扩展

    缘由 一切实现来源于需求,目的在于不盲目造轮子,有小伙伴儿在看了<玩转控件:对Dev中GridControl控件的封装和扩展>文章后,私信作者说,因公司业务逻辑比较复杂,展示字段比较多,尤 ...

  4. PTA数据结构与算法题目集(中文) 7-25

    PTA数据结构与算法题目集(中文)  7-25 7-25 朋友圈 (25 分)   某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干 ...

  5. 分治与递归-Fibonacci数列兔子问题

    裴波那契(Fibonacci leonardo,约1170-1250)是意大利著名数学家.在他的著作<算盘书>中许多有趣的问题,最富成功的问题是著名的“兔子繁殖问题”: 如果每对兔子每月繁 ...

  6. 关于$f(x)=\int_0^x\left|\sin\frac1t\right|\text dt$求导的问题

    首先,我们考虑\(f(x)\)在\(\mathbb R\)上都是定义的.根据定义,显然有\(f(0)=0\):其次,对于\(x\neq0\),不妨先设\(x\gt0\),则有在\(t\rightarr ...

  7. python开发基于SMTP协议的邮件代发服务

    写在这篇文章前照例给大家灌输点名词解释,理论知识,当然已经很熟悉的同学可以往下翻直接看干货 1. 什么是SMTP SMTP即简单传输协议(Simple Mail Transfer Protocol), ...

  8. 【redis】redis

    一.redis简介: 1. reids 也是一个 key-value 存储系统,更加确切地说,它已经是一个非关系型数据库. 2. 关系型. SQL语言. 3. 非关系型. key - value. 4 ...

  9. python_Mock基本使用

    ## 1.mock简介 1. py3已将mock集成到unittest库中 2. 为的就是更好的进行单元测试 3. 简单理解,模拟接口返回参数 4. 通俗易懂,直接修改接口返回参数的值 5. 官方文档 ...

  10. 世界疫情app柱形图显示

    访问云服务器的mysql实现数据的获取.最后通过柱形图的形式将数据显示在页面上: 遇到的主要困难时对于云服务器的mysql连接本地的navicat之间事情,最后通过网上的各种解决办法完成了相关的内容. ...