C++ rand()函数和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() {//创建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;}

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

301重定向IIS设置,及伪静态后 301重定向出错案例分享

301重定向&#xff0c;网络上的知识已经很多了&#xff0c;我在这第一次实践过程中&#xff0c;出现了一个算是低级的错误&#xff0c;但也比较典型&#xff0c;也许其它新手也会碰到&#xff0c;分享一下&#xff1a; 一、301重定向实施&#xff1a; 我们哪里体检网&#xff0…

C++ 通讯录设计(一)

#include<iostream> #include<string> using namespace std;//- 封装函数显示该界面如void showMenu() // - 在main函数中调用封装好的函数//菜单界面函数功能 void showMenu() {cout << "***********************" << endl;cout << &…

C++ 通讯录设计(二)

功能描述: 实现添加联系人功能&#xff0c;联系人上限为1000人&#xff0c;联系人信息包括(姓名、性别、年龄、联系电话、家庭住址) 添加联系人实现步骤: ●设计联系人结构体 ●设计通讯录结构体 ●main函数中创建通讯录 ●封装添加联系人函数 ●测试添加联系人功能 1.1&#…

C++ 通讯录设计(三)

显示联系人 功能描述:显示通讯录中已有的联系人信息 显示联系人实现步骤: . ●封装显示联系人函数 ●测试显示联系人功能 1.1封装显示联系人函数 思路:判断如果当前通讯录中没有人员,就提示记录为空&#xff0c;人数大于0,显示通讯录中信息 //显示联系人 void showPerson(Addr…

C++ 通讯录设计(四)

1、删除联系人 功能描述:按照姓名进行删除指定联系人 删除联系人实现步骤: ●封装检测联系人是否存在 ●封装删除联系人函数 ●测试删除联系人功能 1.1封装检测联系人是否存在 设计思路: 删除联系人前&#xff0c;我们需要先判断用户输入的联系人是否存在&#xff0c;如果存在删…

C++ 通讯录设计(五)

1、查找联系人 功能描述:按照姓名查看指定联系人信恿 查找联系人实现步骤 ●封装查找联系人函数 ●测试查找指定联系人 1.1封装查找联系人函数 实现思路:判断用户指定的联系人是否存在&#xff0c;如果存在显示信息&#xff0c;不存在则提示查无此人。 查找联系人代码: //4、查…

C++ 通讯录设计(六)

1、修改联系人 功能描述:按照姓名重新修改指定联系人 修改联系人实现步骤 ●封装修改联系人函数 ●测试修改联系人功能 1.1封装修改联系人函数 实现思路:查找用户输入的联系人&#xff0c;如果查找成功进行修改操作&#xff0c;查找失败提示查无此人 修改联系人代码: //5、修…

C++ 通讯录设计(七)

1、清空联系人 功能描述:清空通讯录中所有信息 清空联系人实现步骤 ●封装清空联系人函数 ●测试清空联系人 1.1封装清空联系人函数 实现思路:将通讯录所有联系人信息清除掉&#xff0c;只要将通讯录记录的联系人数量置为0,做逻辑清空即可。 清空联系人代码: //6、清空所有联…

C++ 程序运行前内存分区模型

C核心编程 本阶段主要针对C面向对象编程技术做详细讲解,探讨C中的核心和精髓。 1、内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 ●代码区:存放函数体的二进制代码,由操作系统进行管理的 ●全局区:存放全局变量和静态变量以及常量 ●栈区:|由编译器自动分…

C++ 程序运行后的内存模型

程序运行后 栈区: 由编译器自动分配释放,存放函数的参数值,局部变量等 注意事项:不要返回局部变量的地址&#xff0c;栈区开辟的数据由编译器自动释放 #include<iostream> #include<string> using namespace std;int* func() {int a 10; //局部变量放在栈区&am…

C++ 函数的引用传递

#include<iostream> #include<string> using namespace std;//1、值传递 void mySwap01(int a, int b) {int temp a;a b;b temp;cout << "mySwap01 a" << a << endl;cout << "mySwap01 b" << b << end…

C++ 常量引用

#include<iostream> #include<string> using namespace std;int main() {//常量引用//使用场景:用来修饰形参&#xff0c;防止误操作//int a 10;//加上const之后编译器将代码修改int temp 10; const int & ref temp; const int & ref 10;//引用必须引一…

C++ 函数重载碰到默认的参数

#include<iostream> #include<string> using namespace std;//引用作为重载的条件 void func(int &a) { //非常量引用cout << " this is func" << endl; }void func(const int &a) { // 常量引用 const int &a 10; 合…

C++ 对象的初始化和清理

4.2对象的初始化和清理 ●生活中我们买的电子产品都基本会有出厂设置,在某-天我们不用时候也会删除一些自己信息数据保证安全 ●C中的面向对象来源于生活&#xff0c;每个对象也都会有初始设置以及对象销毁前的清理数据的设置。 4.2.1构造函数和析构函数 对象的初始化和清理也是…

C++ 深拷贝与浅拷贝

#include<iostream> using namespace std; #include<string>class Person {public:Person() {cout << "Person的无参构造函数调用" << endl;};Person(int age) {m_Age age;cout << "Person的有参构造函数调用" << en…

转载]Cyclone II JTAG ASP 配置下载程序

原文&#xff1a;http://blog.sina.com.cn/s/blog_4739958a0100irp7.html 首先&#xff0c;还是那句话&#xff0c;电脑上写好程序.pof文件直接通过JTAG写到FPGA SRAM里&#xff0c;掉电丢失。 只有把.pof写到串行配置器件上&#xff0c;板子上电后串行配置器件EPCS4将程序自动…

C++ 类和对象成员特性

//当类中成员是其他类对象时&#xff0c;我们称该成员为对象成员 //构造的顺序是:先调用对象成员的构造&#xff0c;再调用本类构造 //析构顺序与构造相反 #include <iostream> using namespace std; #include <string>class Phone{public:Phone(string name){m_P…

C++ 静态成员

静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员 静态成员分为: ●静态成员变量 。所有对象共享同一份数据 。在编译阶段分配内存 。类内声明&#xff0c;类外初始化 ●静态成员函数I 。所有对象共享同一个函数 。静态成员函数只能访问静态成员变量 #include…

C++ 静态成员函数

#include <iostream> using namespace std; #include <string>class Person{public://静态成员函数特点://1程序共享一个函数//2静态成员函数只能访问静态成员变量static void func(){cout << "func调用" << endl;m_A 100;//m. _B 100; //…