C++如何解決rand()函數(shù)生成的隨機(jī)數(shù)每次都一樣的問(wèn)題
rand()函數(shù)生成的隨機(jī)數(shù)每次都一樣問(wèn)題
C++的隨機(jī)數(shù)函數(shù)rand是一個(gè)偽隨機(jī)數(shù),從固定的初始種子計(jì)算得出。所以每次運(yùn)行獲取到的隨機(jī)數(shù)序列是相同的。
要解決這一問(wèn)題,需要設(shè)置一個(gè)隨機(jī)數(shù)種子,一般用當(dāng)前時(shí)間作為種子
#include <iostream> #include <time.h> using namespace std; int main() { srand((unsigned)time(NULL)); int n = rand() % 100; cout << n << endl; }
解讀rand()為啥每次生成的數(shù)都是一樣的
在運(yùn)行一個(gè)帶有rand()的程序的時(shí)候,想打印一下它的值,發(fā)現(xiàn)每一次打印都是41,第一個(gè)數(shù)
原來(lái)rand()是計(jì)算機(jī)內(nèi)的一個(gè)生成偽隨機(jī)數(shù)的,生成的其實(shí)并不是隨機(jī)數(shù),而是具有一定規(guī)律的遞推出來(lái)的數(shù)。
要在rand()前面加上sand(time(0)),不要忘記加上頭文件time.h,
sand(time(0))不能放在循環(huán)里面寫(xiě)
如果計(jì)算偽隨機(jī)序列的初始數(shù)值(稱為種子)相同,則計(jì)算出來(lái)的偽隨機(jī)序列就是完全相同的。這個(gè)特性被有的軟件利用于加密和解密。加密時(shí),可以用某個(gè)種子數(shù)生成一個(gè)偽隨機(jī)序列并對(duì)數(shù)據(jù)進(jìn)行處理
每產(chǎn)生一個(gè)隨機(jī)數(shù)之前,都調(diào)用一次srand,而由于計(jì)算機(jī)運(yùn)行很快,所以你每次用time得到的時(shí)間都是一樣的(time的時(shí)間精度較低,只有55ms)。這樣相當(dāng)于使用同一個(gè)種子產(chǎn)生隨機(jī)序列,所以產(chǎn)生的隨機(jī)數(shù)總是相同的。應(yīng)該把srand放在循環(huán)外
po上藍(lán)橋奪冠概率的代碼
#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; }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++實(shí)現(xiàn)掃雷小游戲(控制臺(tái))
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05C++異步操作future和aysnc與function和bind
這篇文章主要介紹了C++異步操作future和aysnc與function和bind,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09嵌入式C語(yǔ)言二級(jí)指針在鏈表中的應(yīng)用
這篇文章主要為大家介紹了嵌入式C語(yǔ)言二級(jí)指針在鏈表中的應(yīng)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04C語(yǔ)言實(shí)現(xiàn)電子時(shí)鐘程序
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電子時(shí)鐘程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11C語(yǔ)言實(shí)現(xiàn)“幸運(yùn)數(shù)”的實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)“幸運(yùn)數(shù)”的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07C++實(shí)現(xiàn)LeetCode(159.最多有兩個(gè)不同字符的最長(zhǎng)子串)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(159.最多有兩個(gè)不同字符的最長(zhǎng)子串),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07Qt5開(kāi)發(fā)視頻播放器的項(xiàng)目實(shí)踐
Qt對(duì)音視頻的播放和控制、相機(jī)拍攝、收音機(jī)等多媒體應(yīng)用提供了強(qiáng)大的支持,本文主要介紹了Qt5開(kāi)發(fā)視頻播放器,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08通過(guò)一個(gè)小例子來(lái)簡(jiǎn)單理解C語(yǔ)言中的內(nèi)存空間管理
這篇文章主要介紹了通過(guò)一個(gè)小例子來(lái)簡(jiǎn)單理解C語(yǔ)言中的內(nèi)存空間管理,涉及到堆和棧等數(shù)據(jù)結(jié)構(gòu)的基本知識(shí),需要的朋友可以參考下2015-11-11vs code 配置c/c++環(huán)境的詳細(xì)教程(推薦)
這篇文章主要介紹了vs code 配置c/c++環(huán)境的詳細(xì)教程(推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11