C++如何解决rand()函数生成的随机数每次都一样的问题

 更新时间:2023年08月01日 11:09:14   作者:Carpe_yj_Diem  
这篇文章主要介绍了C++如何解决rand()函数生成的随机数每次都一样的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

rand()函数生成的随机数每次都一样问题

C++的随机数函数rand是一个伪随机数,从固定的初始种子计算得出。所以每次运行获取到的随机数序列是相同的。

要解决这一问题,需要设置一个随机数种子,一般用当前时间作为种子

#include <iostream>
#include <time.h>
using namespace std;
int main()
{
	srand((unsigned)time(NULL));
	int n = rand() % 100;
	cout << n << endl; 
}

解读rand()为啥每次生成的数都是一样的

在运行一个带有rand()的程序的时候,想打印一下它的值,发现每一次打印都是41,第一个数

原来rand()是计算机内的一个生成伪随机数的,生成的其实并不是随机数,而是具有一定规律的递推出来的数。

要在rand()前面加上sand(time(0)),不要忘记加上头文件time.h,

sand(time(0))不能放在循环里面写

如果计算伪随机序列的初始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的。这个特性被有的软件利用于加密和解密。加密时,可以用某个种子数生成一个伪随机序列并对数据进行处理

每产生一个随机数之前,都调用一次srand,而由于计算机运行很快,所以你每次用time得到的时间都是一样的(time的时间精度较低,只有55ms)。这样相当于使用同一个种子产生随机序列,所以产生的随机数总是相同的。应该把srand放在循环外

po上蓝桥夺冠概率的代码

#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main()
{
	/* 
	甲   乙    丙    丁   
甲   -    0.1  0.3   0.5
乙  0.9   -    0.7   0.4 
丙  0.7  0.3   -     0.2
丁  0.5  0.6  0.8    -
*/
	int randf;
	long long int win=0;
	srand(time(0));
	for(int i=1;i<=100000;i++)
	{
		randf=rand();
		if(randf%3==0)//ab
		{
			if(randf%10<1){//a win b
				if(randf%10<2){//c win d
					if(randf%10<3)win++;
				}
				else{//d win c
					if(randf%10<5)win++;
				}
			}
		}
		else if(randf%3==1)//ac
		{
			if(randf%10<3)//a win c
			{
				if(randf%10<4)//b win d
				{
					if(randf%10<1)win++;
				}
				else//d win b
				{
					if(randf%10<5)win++;
				}
			}
		}
		else  //ad
		{
			if(randf%10<5)//a win d
			{
				if(randf%10<3)//c win b
				{
					if(randf%10<3)win++;
				}
				else//b win c
				{
					if(randf%10<1)win++;
				}
			}
		}
	}
	printf("%f\n",win/100000.0);
	return 0;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C语言断言函数assert()的学习笔记

    C语言断言函数assert()的学习笔记

    在C语言库函数中提供了一个辅助调试程序的小型库,它是由assert()宏组成,本文就详细的介绍了一下如何使用,感兴趣的可以了解一下
    2021-11-11
  • C语言实现链栈的步骤

    C语言实现链栈的步骤

    链栈是栈的链式存储结构,链栈可以用单链表的头插法实现,本文主要讲述了如何用c语言去实现链栈,感兴趣的朋友可以了解下
    2021-05-05
  • C++代码实现网络Ping功能

    C++代码实现网络Ping功能

    这篇文章主要介绍了C++代码实现网络Ping功能,Ping命令被送到本地计算机的IP软件,该命令永不退出该计算机,本文给大家介绍的非常详细,需要的朋友参考下吧
    2021-08-08
  • C++踩坑实战之构造和析构函数

    C++踩坑实战之构造和析构函数

    不论是构造函数,还是析构函数,都是C++、C#语言相对于其他语言而言特殊的地方,它是为了方便类中对象的初始化,这篇文章主要给大家介绍了关于C++踩坑实战之构造和析构函数的相关资料,需要的朋友可以参考下
    2021-07-07
  • C++ std::thread 使用方法

    C++ std::thread 使用方法

    这篇文章主要介绍了C++ std::thread 如何使用,C++中的std::thread类提供了一种方便的多线程编程方式,在使用std::thread类时,我们需要注意线程间的同步和通信问题,以确保多个线程之间的正确协同工作需要的朋友可以参考下
    2023-03-03
  • QT编写地图实现获取区域边界

    QT编写地图实现获取区域边界

    区域边界是一些坐标点集合,而且不同的行政区划得到的区域边界点数组集合个数不同。本文将具体介绍QT在编写地图时如何实现获取区域边界,需要的可以参考一下
    2022-01-01
  • Qt+OpenCV利用帧差法实现车辆识别

    Qt+OpenCV利用帧差法实现车辆识别

    所谓帧差法也就是对连续图像帧做差分运算,其结果与定义好的阈值比较,若大于阈值则为运动目标值为1,否则值为0 。本文将利用帧差法实现车辆识别,感兴趣的可以了解一下
    2022-08-08
  • C/C++实现投骰子游戏

    C/C++实现投骰子游戏

    这篇文章主要为大家详细介绍了C/C++实现投骰子游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C语言实现套接字操作的示例代码

    C语言实现套接字操作的示例代码

    在C语言中,套接字(Socket)是一种进行网络通信的接口,这篇文章就来和大家介绍一下C语言中是如何进行套接字操作的,需要的可以参考一下
    2023-06-06
  • C语言strlen,strcpy,strcmp,strcat,strstr字符串操作函数实现

    C语言strlen,strcpy,strcmp,strcat,strstr字符串操作函数实现

    这篇文章主要介绍了C语言strlen,strcpy,strcmp,strcat,strstr字符串操作函数实现,,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-09-09

最新评论