每日一貼,今天的內容關鍵字為隨機種子
在c語言里面,兩個函數包括在<stdlib.h>頭文件里面,c++里面,標准庫<cstdlib>(被包括於<iostream>中).
srand函數是隨機數發生器的初始化函數。
原型:void srand(unsigned seed);
rand函數用來發生隨機數,當然是偽隨機數。
原型:int rand(void)
seed的作用:srand函數的作用是根據參數seed,設置一個隨機起始點,而rand函數根據這個起始點,發生隨機數序列。默認的隨機種子為1。如果隨機種子一樣,rand函數所發生的隨機序列也一樣。
因此,為使每次程序運行都能發生不同的隨機序列,每次都應發生一個不同的種子參數。
說明:
因為rand的內部實現是用線性同余法做的,它不是真的隨機數,只不過是因為其周期特別長,所以有一定的范圍里可看成是隨機的,rand()會返回一隨機數值,范圍在0至RAND_MAX 間。在調用此函數發生隨機數前,必須先利用srand()設好隨機數種子,如果未設隨機數種子,rand()在調用時會主動設隨機數種子為1。rand()發生的是假隨機數字,每次執行時是雷同的。若要不同,以不同的值來初始化它.初始化的函數就是srand()。
返回值:
返回0至RAND_MAX之間的隨機整數值,RAND_MAX的范圍起碼是在32767之間(int),即雙字節(16位數)。若用unsigned int 雙字節是65535,四字節是4294967295的整數范圍。
0~RAND_MAX每一個數字被選中的機率是雷同的。
運用示例:
//取得0~6之間的隨機整數 #include <iostream> int main() { for(int i=0;i<10;i++) { ran_num=rand()%6; cout<<ran_num<<" "; } return 0; } //由於種子默認都是1,故每次運行都將輸出:5 5 4 4 5 4 0 0 4 2
指定seed為定值1時:
//取得0~6之間的隨機整數 #include <iostream> int main() { srand(1); for(int i=0;i<10;i++) { ran_num=rand()%6; cout<<ran_num<<" "; } return 0; } //由於種子沒變更,每次運行都將輸出:5 5 4 4 5 4 0 0 4 2
指定seed為定值6:
//取得0~6之間的隨機整數 #include <iostream> int main() { srand(6); for(int i=0;i<10;i++) { ran_num=rand()%6; cout<<ran_num<<" "; } return 0; } //由於種子沒變更,每次運行都將輸出:每次運行都將輸出:4 1 5 1 4 3 4 4 2 2
那么我們如何發生一個偽隨機的種子呢?一般指定seed為當前系統流逝了的時光(單位為秒):time_t time(0):
//取得0~6之間的隨機整數 #include <iostream> #include <ctime>//時光函數 int main() { srand((unsigned)time(0)); for(int i=0;i<10;i++) { ran_num=rand()%6; cout<<ran_num<<" "; } return 0; }
第一次運行時輸出:0 1 5 4 5 0 2 3 4 2
第二次:3 2 3 0 3 5 5 2 2 3
總之,每次運行結果將不一樣,因為每次啟動程序的時辰都不同(距離須大於1秒?見下)。
關於time_t time(0):
time_t被定義為長整型,它返回從1970年1月1日零時零分零秒到目前為止所經過的時光,單位為秒。比如假設輸出:
cout<<time(0);
值約為1169174701,約等於37(年)乘365(天)乘24(小時)乘3600(秒)(月日沒算)。
另外,關於ran_num = rand() % 6,將rand()的返回值與6求模是必須的,這樣才能確保目的隨機數落在[0,6)之間,否則rand()的返回值本身多是很偉大的。
一個通用的公式是:
要取得[a,b)之間的隨機整數,使用(rand() % (b-a))+ a (結果值將含a不含b)。在a為0的情況下,簡寫為rand() % b。
另外還有一種比較常用的發生隨機種子的函數:
srand(time(NULL)); //是以當前時光為種子,發生隨意數。其中,time(NULL)用來獲得當前時光,本質上失掉的是一個大整數,然后用這個數來隨機數。
最后,關於偽隨機浮點數:
用rand() / double(RAND_MAX)可以取得0~1之間的浮點數(注意,不同於整型時候的公式,是除以,不是求模),舉例:
#include <iostream> #include <ctime>//時光函數 int main() { double ran_numf=0.0; srand((unsigned)time(0)); for(int i=0;i<10;i++) { ran_numf = rand() / (double)(RAND_MAX); cout<<ran_numf<<" "; } return 0; }
運行結果為:0.716636,0.457725,…等10個0~1之間的浮點數,每次結果都不同。
如果想取更大范圍的隨機浮點數,比如1~10,可以將rand() /(double)(RAND_MAX) 改為rand() /(double)(RAND_MAX/10)
運行結果為:7.19362,6.45775,…等10個1~10之間的浮點數,每次結果都不同。
至於100,1000的情況,如此類推。
以上不是偽隨機浮點數最好的實現方法,不過可以將就着用用…
文章結束給大家分享下程序員的一些笑話語錄: 程序員的願望
有一天一個程序員見到了上帝.上帝: 小伙子,我可以滿足你一個願望.程序員: 我希望中國國家隊能再次打進世界杯.
上帝: 這個啊!這個不好辦啊,你還說下一個吧!
程序員: 那好!我的下一個願望是每天都能休息6個小時以上.
上帝: 還是讓中國國家打進世界杯.
--------------------------------- 原創文章 By 隨機和種子 ---------------------------------