随机数和伪随机的区别 :

#include<iostream>
using namespace std;
#include<string>#include<string>
#include   <stdlib.h>
#include   <time.h>
#define MIN 0    //随机数产生的范围
#define MAX 99  //函数声明
void suiji();
void weisuiji();//学生结构体
struct Student {string name;int age;int score;
};struct Teacher {string tName;struct Student sArray[5];};//定义一个给老师学生赋值的函数
void allocateSpace(struct Teacher tArray[], int len){string nameSeed = "ABCDE";//给老师赋值for (int i = 0; i <len; i++){tArray[i].tName = "Teacher_";tArray[i].tName += nameSeed[i];//给老师的每个学生赋值for (int j = 0; j < 5; j++){tArray[i].sArray[j].name = "Student_";tArray[i].sArray[j].name += nameSeed[j];tArray[i].sArray[j].age = 30;tArray[i].sArray[j].score = 70;//分数的设定int random = rand() % 60+40;tArray[i].sArray[j].score = random;//tArray->sArray->name= "Student_";//tArray->sArray->name += nameSeed[j];//tArray->sArray->score = 60;//tArray->sArray->age = 20;}}}void printInfo(struct Teacher tArray[], int len) {for (int i = 0; i < len; i++){cout << "老师的姓名:" << tArray[i].tName << endl;   for (int j = 0; j < 5; j++){cout << "\t老师的学生姓名:" << tArray[i].sArray[j].name << " 学生年龄:" << tArray[i].sArray[j].age << " 学生分数:" << tArray[i].sArray[j].score << endl;}}
}int main() {//创建3名老师的数组struct Teacher tArray[3];//通过函数给3名老师的信息赋值,并给老师带的学生信息也赋值//int len = sizeof(tArray)/ sizeof(tArray[0]);//cout << "老师的数组长度:" << len << endl;//allocateSpace(tArray, len);//打印所以老师学生信息//printInfo(tArray, len);suiji();weisuiji();system("pause");
}void suiji() {int i;srand((unsigned)time(NULL));cout << "Ten random numbers from " << MIN << " to " << MAX << " :\n" << endl;for (i = 0; i < 10; i++)          //产生随机数  {cout << MIN + rand() % (MAX + MIN - 1) << "\t" ;}cout << endl;
}void weisuiji() {int i;srand((unsigned)time(0));cout << "Ten random numbers from " << MIN <<" to " << MAX << " :\n" << endl;for (i = 0; i < 10; i++)          //产生随机数  {cout << MIN + (int)MAX * rand() / (RAND_MAX + 1) << "\t" ;}cout << endl;}

(一)、rand()函数说明 :

rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定

的范围里可看成是随机的。

rand()返回一随机数值的范围在0至RAND_MAX 间。RAND_MAX的范围最少是在32767之间(int)。用

unsigned int 双字节是65535,四字节是4294967295的整数范围。0~RAND_MAX每个数字被选中

的机率是相同的。

用户未设定随机数种子时,系统默认的随机数种子为1。

rand()产生的是伪随机数字,每次执行时是相同的;若要不同,用函数srand()初始化它。

(二)、srand()函数说明
  功   能:   初始化随机数发生器   
  用   法:   void srand(unsigned  int  seed);  
  所在头文件: stdlib.h  
  函数说明:
               srand()用来设置rand()产生随机数时的随机数种子。

参数seed必须是个整数,通常可以利用time(0)的返回值或NULL来当做seed。

如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。

三、rand()和srand()的关系

rand()和srand()要一起使用,其中srand()用来初始化随机数种子,rand()用来产生随机数。

因为默认情况下随机数种子为1,而相同的随机数种子产生的随机数是一样的,失去了随机性的意义,所以为使每次得到的随机数不一样,用函数srand()初始化随机数种子。srand()的参数,用time函数值(即当前时间),因为两次调用rand()函数的时间通常是不同的,这样就可以保证随机性了。

四、产生一定范围随机数的通用表示公式

要取得[a,b)的随机整数,使用(rand() % (b-a))+ a (结果值含a不含b)。
      要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a (结果值含a和b)。
      要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1 (结果值不含a含b)。

(总的来说,通用公式:a + rand() % n ;其中的a是起始值,n是整数的范围)

要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。

要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。

五、产生相同的随机数的原因

计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。)

我们知道rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统。

#include<iostream>
using namespace std;
#include<string>#include<string>
#include   <stdlib.h>
#include   <time.h>
#define MIN 0    //随机数产生的范围
#define MAX 99  //学生结构体
struct Student {string name;int age;int score;
};struct Teacher {string tName;struct Student sArray[5];};//定义一个给老师学生赋值的函数
void allocateSpace(struct Teacher tArray[], int len){string nameSeed = "ABCDE";//给老师赋值for (int i = 0; i <len; i++){tArray[i].tName = "Teacher_";tArray[i].tName += nameSeed[i];//给老师的每个学生赋值for (int j = 0; j < 5; j++){tArray[i].sArray[j].name = "Student_";tArray[i].sArray[j].name += nameSeed[j];tArray[i].sArray[j].age = 30;tArray[i].sArray[j].score = 70;//分数的设定int random = rand() % 60+40;tArray[i].sArray[j].score = random;//tArray->sArray->name= "Student_";//tArray->sArray->name += nameSeed[j];//tArray->sArray->score = 60;//tArray->sArray->age = 20;}}}void printInfo(struct Teacher tArray[], int len) {for (int i = 0; i < len; i++){cout << "老师的姓名:" << tArray[i].tName << endl;   for (int j = 0; j < 5; j++){cout << "\t老师的学生姓名:" << tArray[i].sArray[j].name << " 学生年龄:" << tArray[i].sArray[j].age << " 学生分数:" << tArray[i].sArray[j].score << endl;}}
}int main() {//创建3名老师的数组struct Teacher tArray[3];//通过函数给3名老师的信息赋值,并给老师带的学生信息也赋值int len = sizeof(tArray)/ sizeof(tArray[0]);cout << "老师的数组长度:" << len << endl;allocateSpace(tArray, len);//打印所以老师学生信息printInfo(tArray, len);//    suiji();
//  weisuiji();system("pause");
}

每次运行得到相同的随机序列:

为得到不同的随机数序列,则需改变这个种子的值。方法:在开始产生随机数前,调用一次srand(time(NULL))(注意:srand()一定要放在循环外面或者是循环调用的外面,否则的话得到的是相同的随机数)。

所以我们使用了srand()函数之后,加了随机种子

#include<iostream>
using namespace std;
#include<string>#include<string>
#include   <stdlib.h>
#include   <time.h>
#define MIN 0    //随机数产生的范围
#define MAX 99  //函数声明
void suiji();
void weisuiji();//学生结构体
struct Student {string name;int age;int score;
};struct Teacher {string tName;struct Student sArray[5];};//定义一个给老师学生赋值的函数
void allocateSpace(struct Teacher tArray[], int len){string nameSeed = "ABCDE";//给老师赋值for (int i = 0; i <len; i++){tArray[i].tName = "Teacher_";tArray[i].tName += nameSeed[i];//给老师的每个学生赋值for (int j = 0; j < 5; j++){tArray[i].sArray[j].name = "Student_";tArray[i].sArray[j].name += nameSeed[j];tArray[i].sArray[j].age = 30;tArray[i].sArray[j].score = 70;//分数的设定int random = rand() % 60+40;tArray[i].sArray[j].score = random;//tArray->sArray->name= "Student_";//tArray->sArray->name += nameSeed[j];//tArray->sArray->score = 60;//tArray->sArray->age = 20;}}}void printInfo(struct Teacher tArray[], int len) {for (int i = 0; i < len; i++){cout << "老师的姓名:" << tArray[i].tName << endl;   for (int j = 0; j < 5; j++){cout << "\t老师的学生姓名:" << tArray[i].sArray[j].name << " 学生年龄:" << tArray[i].sArray[j].age << " 学生分数:" << tArray[i].sArray[j].score << endl;}}
}int main() {//随机种子srand((unsigned int)time(NULL));//创建3名老师的数组struct Teacher tArray[3];//通过函数给3名老师的信息赋值,并给老师带的学生信息也赋值int len = sizeof(tArray)/ sizeof(tArray[0]);cout << "老师的数组长度:" << len << endl;allocateSpace(tArray, len);//打印所以老师学生信息printInfo(tArray, len);//  suiji();
//  weisuiji();system("pause");
}void suiji() {int i;srand((unsigned)time(NULL));cout << "Ten random numbers from " << MIN << " to " << MAX << " :\n" << endl;for (i = 0; i < 10; i++)          //产生随机数  {cout << MIN + rand() % (MAX + MIN - 1) << "\t" ;}cout << endl;
}void weisuiji() {int i;srand((unsigned)time(0));cout << "Ten random numbers from " << MIN <<" to " << MAX << " :\n" << endl;for (i = 0; i < 10; i++)          //产生随机数  {cout << MIN + (int)MAX * rand() / (RAND_MAX + 1) << "\t" ;}cout << endl;}

发现这个学生分数不一样了

C++ rand()函数和srand()函数相关推荐

  1. rand()函数与srand()函数以及随机数种子详解

    目录 引言 rand()函数 随机数 srand()函数 拓展思考 引言 初学者大部分对这两个函数的意义都不甚了解,以及不明白为什么需要srand()函数来播种,这里会对两函数的意义进行解释,让大家明 ...

  2. C++:rand()函数和srand()函数解读

    (1)srand(unsigned int t)这个是设定种子. 因为电脑取随机数是伪随机,只要种子一样,则取出来的数一定一样. 这里用time(0)这个内函数,copy则是返回了当前的时间值. 这个 ...

  3. rand函数和srand函数的用法和区别

    srand初始化随机种子,rand产生随机数 rand(产生随机数) 表头文件: #include<stdlib.h>           //标准库 <cstdlib> (被 ...

  4. rand在c语言那一个函数库,浅析C语言中的rand函数和srand函数(一)

    我们在编程实现算法的过程中,往往需要使用到随机数.由于计算机是一台以逻辑为基础的机器,没法做到真正的随机(大概量子计算机可以?).所以计算机生成的是伪随机数,供我们使用. 我们使用C语言的rand函数 ...

  5. c语言生成1000 9999随机数,产生随机数(rand()函数和srand()函数)

    有时候,我们需要随机产生一个在某范围的数,C/C++提供了一个库函数rand()来产生随机数. 函数原型:int rand(void); 功能:返回一个[0,RAND_MAX]间的随机整数.其中RAN ...

  6. C语言 rand函数,srand函数 生成随机数用法详解

    与随机数有关的两个函数,srand() 和 rand(),这两个函数都包含"stdlib.h"头文件里 srand()函数是随机数发生器,使得每轮产生的随机数列都不相同.      ...

  7. C语言中随机数的生成(rand函数和srand函数)

    CSDN话题挑战赛第2期 参赛话题:学习笔记 学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程.这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路.学习之乐,独乐乐,不如众乐 ...

  8. C语言详解生成随机数的过程,time函数、时间戳timer、rand函数和srand函数,附猜数字小游戏

    第十一篇:随机数详解 一.准备工作(预备知识) 1.1.生成伪随机数(函数rand) 1.2.伪随机数"变成"随机数(函数time) 1.3.生成确定范围随机数 二.练手随机数经典 ...

  9. C++中rand函数和srand函数

    参考链接:https://blog.csdn.net/candyliuxj/article/details/4396666 注意:%为取余 1.rand()不需要参数,它会返回一个从0到最大随机数的任 ...

最新文章

  1. CentOS 7安装mysql-5.6.17
  2. java代码中出现乱码怎么解决?
  3. linux perl开发工具,专家推荐 几款常用Perl开发工具
  4. Java开发笔记(一百四十)JavaFX的选择框
  5. sql怎么select中位数_怎么能避免写出慢SQL?
  6. 达摩达兰论估价pdf_故事与估值epub+azw3+mobi文字版pdf+txt多看word魔鸠搜雅书屋
  7. Windows 服务快捷启动命令
  8. PHP开发erp功能模块,ERP基础知识之功能模块介绍
  9. 含泪整理最优质QuickTime软件插件素材,你想要的这里都有
  10. Linux 应用程序安装卸载
  11. 一分钟详解三维重建学习路线
  12. 百度网盘网页倍速播放视频的小技巧
  13. 微信小程序实现点赞与取消点赞功能
  14. android文件上传413 nginx [error] 9679#0: *318855 client intended to send too large body: 1593409 bytes
  15. Lecture 11: Derived Distributions; Convolution; Covariance and Correlation
  16. 同相和反相比例运算放大电路
  17. 区块链开发指南_区块链开发权威指南
  18. Archlinux:安装Nvidia闭源驱动的艰难日子
  19. 防静电手环在计算机中的功能,无线静电手环是怎样防静电的原理是什么
  20. 【图像处理】小波编码图像中伪影和纹理的检测(Matlab代码实现)

热门文章

  1. mysql并发 node_nodejs写入mysql单次数据量过大的解决方法_沃航科技
  2. 查看目录是否为内存盘_Linux buff/cache内存释放
  3. oracle数据库各组件介绍,Oracle 数据库 组件相关说明【第一部分】
  4. python实例 71,72
  5. php ajax xmlhttpreq 上传文件 get,使用Ajax XmlHttpRequest上传文件
  6. 【Excel】统计不重复数据的个数,设置单元格不允许出现重复数据
  7. mysql模糊查询LIKE、REGEXP(正则)的详解(在可视化工具navicat下)
  8. Linux下Rails3 + Lighttpd + fcgi部署研究
  9. .net core consul 服务配置 服务发现 服务健康检测 服务变更加载
  10. dubbo实现原理之SPI简介