[爆卦]撲克牌產生器是什麼?優點缺點精華區懶人包

為什麼這篇撲克牌產生器鄉民發文收入到精華區:因為在撲克牌產生器這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者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<<"硬幣投出正面";

}

}

你可能也想看看

搜尋相關網站