C++產生隨機數
1.C++中沒有自帶的random函數,要實現隨機數的生成就需要使用rand()和srand()。
2.函數rand()是真正的隨機數生成器,而srand()會設置供rand()使用的隨機數種子。如果你在第一次調用rand()之前沒有調用srand(),那么系統會為你自動調用srand()。而使用同種子相同的數調用 srand()會導致相同的隨機數序列被生成。
srand((unsigned)time(NULL))則使用系統定時/計數器的值做為隨機種子。每個種子對應一組根據算法預先生成的隨機數,所以,在相同的平台環境下,不同時間產生的隨機數會是不同的,相應的,若將srand(unsigned)time(NULL)改為srand(TP)(TP為任一常量),則無論何時運行、運行多少次得到的“隨機數”都會是一組固定的序列,因此srand生成的隨機數是偽隨機數。
3.rand函數產生一個0到RAND_MAX的偽隨機數,這里的RAND_MAX因不同的實現而異,但RAND_MAX至少為32767。有些時候,用戶需要獲取一定更小范圍中的一隨機數,如得到一組100以內的隨機數,就可以采用rand()%100這種方法,使得結果在100以內。
%是模運算,表示整除 右操作數 取余數
如果想得到【1,100】之間的隨機數,則需要對上面的加法進行加工,寫成:(rand()%100)+1; //先得到0-99的隨機數,然后加1,可得1-100區間內的數。rand()%m這個函數是隨機產生0到m-1的隨機數;比如rand()%10就是隨機產生0到9的隨機數。
【實例】:撲克牌發牌游戲程序。設計一個程序來給四個玩家發牌(不含大小王),要求每次發出的牌都不一樣。
分析:52張牌采用1~52代表,其中黑桃對應1~13,紅桃對應14~26,梅花對應27~39,方塊對應40~52例如:28是梅花2,29是梅花3。將52張牌(號) 依次隨機放入數組Deck中。方法是隨機產生在數組中放置的位置r(下標號),如果該位置已有牌(Deck(r\\=0)、則重新生成新的位置r,直到該位置無牌。
#include<iostream> #include<cstdlib> #include<ctime>using namespace std;int main() { int i, card, r, Deck[52]; int tag = 0; char pock_c[4][5] = { "黑桃","紅桃","梅花","方塊" }; char pock_n[13][3] = { "A","2","3","4","5","6","7","8","9","10" ,"J","Q","K" }; srand((unsigned)time(0)); for (i = 0; i < 52; i++) { Deck[i] = 0; } for (card = 1; card <= 52; card++) { r = rand ()% 52; while (Deck[r] != 0)//該位置Deck[r]已有牌,則重新產生位置r { r = rand() % 52;
} Deck[r] = card;//牌card存入數組Deck } cout << "玩家\t玩家2\t玩家3\t玩家4\n"; cout << "--------------------------------------------\n"; for (i = 0; i < 52; i++) { cout << pock_c[(Deck[i] - 1) / 13] << pock_n[(Deck[i] - 1) % 13] << '\t'; if (i % 4 == 3) cout << endl;//使產生的隨機數按4列排列 } system("pause"); return 0; }