為什麼這篇撲克牌產生器鄉民發文收入到精華區:因為在撲克牌產生器這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者yantchen (球童Yanting)看板NTUE-CS99標題[課業] C++亂數產生器語法...
亂數的運作
亂數(random number)是指隨機產生的數字。隨機也就是指每個數字出現的機率
都是一樣的,所以我們可以利用亂數來模擬投硬幣、骰子或是發撲克牌、樂透
等等。以投硬幣來說,我們可以讓電腦產生0或1的亂數,分別代表硬幣正反面
當然電腦不可能真的去投硬幣,電腦是利用統計原理產生出來的亂數表來產生
亂數。有了亂數表,就可以產生亂數了。但是,如果程式沒有更換亂數表,每
次執行程式的時候,都會使用預設的那張亂數表,導致每次的結果都一樣,降
就不叫亂數了,所以在程式的一開始,需要每次都找一張不同的亂數表,通常
我們會用時間當作種子,因為每次執行程式的時間都不一樣( 排除每次執行程
式都把時間調成一樣這種搗蛋的情況 ),所以就可以拿到每次執行都不一樣的
亂數囉。
C++裡面,亂數產生器會產生int範圍的整數,也就是說,3287898 類似這樣的東西
可是我們需要的可能只是1~6或者0,1,那要怎麼辦呢?
先假設亂數的範圍是1~100
要產生0,1的亂數 有很多方法
EX: 把1~50當做0, 51~100當做1
或者 把單數當作0, 雙數當作1
那如果是產生1~6的話
最簡單的方式就是取餘數來切割亂數範圍
rand()%6+1; 把亂數除以六再加一 相當於產生1,2,3,4,5,6的亂數
但如果範圍是1~100,勢必會變成不公平的骰子
因為C++裡面產生的亂數範圍高達2^32,就可以達到統計所說的,骰子投一百萬次
機率會很接近1/6一樣。
PS:
有一個公式大家可以參考一下
產生a到b之間的亂數 (rand()%(b-a+1))+a;
EX: 產生1~6 rand()%6+1;
亂數產生器的語法
rand();
任意產生int範圍( -2^31 ~ (2^31)-1 )內的一個整數,不用傳入值
srand(unsigned int n);
選取第n張亂數表 ( n 又稱種子 必須要是正整數 )
time(time_t*);
傳回現在到格林威治1970/1/1 12:00am的秒差
結合time跟srand : srand((unsigned)time(NULL)); (當做公式背下來)
rand 和 srand 需要 #include<stdlib.h>
time 需要 #include<time.h>
亂數產生器的用法
舉投銅板的例子
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main(){
srand((unsigned)time(NULL)); //選一張亂數表
int a;
a=rand()%2; //產生0,1的亂數
if(a==0){ //0當反面
cout<<"硬幣投出反面";
} else { //1當正面
cout<<"硬幣投出正面";
}
}