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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值