C++如何解决rand()函数生成的随机数每次都一样的问题
作者: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; }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。