高質量的C代碼.關於獲取隨機數.20010704
未經許可,不的轉載
版權歸屬高雷個人
聯系方式:
email:[email protected]
QQ: 38929568
本系列BLOG僅在以下2個地址發布
http://kome2000.blog.51cto.com/
http://blog.csdn.net/kome2000
在C語言中使用rand()函數來獲取隨機數,但是如下語句
int i; i=rand();
每次得到的隨機數都是一樣的,據了解在C/C++中這樣做是為了方便調試。
如果要每次都產生不同的隨機數,我們則需要增加
srand(time(NULL));這條語句,他的作用是以時間為種子,產生隨機數我們都知道時間是在不斷變化的,但兩次獲取隨機數要在1毫秒後,否則數值還是一樣)。
本文主要討論的是如何在較短時間內獲取不同的隨機數
1.1 通過交換使得原有順序打亂,得到隨機效果。
我們在做棋盤,麻將之類的游戲的時候,需要初始化游戲,也就是洗牌,牌數固定54張,初始時的順序也固定,比如黑桃A23456..K等,
也就是有一個數組card[54]
int card[54]; int i; //洗牌 for(i=0;i<54;i++) { int tempIndex = rand(54); //獲取0到53的隨機數 int temp; //交換2張牌 temp = card[i]; card[i] = card[tempIndex]; card[tempIndex] = card[i]; }
這樣就可以達到洗牌的目的了,但是rand()這個函數在較短時間內執行會得到很多相同的數,這並不是我們想要的,下面會有辦法解決
1.2 類似掃雷游戲中,使用隨機數布雷
要隨機一個行坐標,一個列坐標,然後把這個坐標位置上置為雷。
一個行坐標,一個列坐標,這在較短時間內隨機出來的數會一樣,我們可以把行列放在一起,從2維降到1維,再布雷,
比如一個10*12的雷區10列*12行)
int i; int area=10*12; //布雷 for(i=0;i<area;i++) { int tempIndex = rand(area); //獲取0-119的隨機數 int row = tempIndex%12; //行坐標 int col = tempIndex/10; //列坐標 //map[col][row] = -1; //將該位置設置成雷 }
通過降低維數,在一個循環內使用一次獲取隨機數,同樣會有2次獲取的隨機數一樣的問題,
1.3 使用一個數組記錄一組隨機數,再次使用的時候,可以在很短時間內獲取到不同的隨機數
這組數據可以在用戶每次按鍵操作的時候獲取當時的系統時間,把這些數據作為種子,用一個索引來表示當前數據所在位置
或者可以使用循環鏈表,下面為方便起見使用的是數組!
const int RAND_SIZE = 100; static int32 rand[RAND_SIZE]; static int randIndex=0; void setRandomValue(int32 value) { randIndex++; randIndex = randIndex % RAND_SIZE; rand[randIndex] = value; } static int32 getRandomValue() { randIndex--; if( randIndex<0 ) { randIndex = RAND_SIZE-1; } return rand[randIndex]; } static int32 lastRandSeed; //這個方法可以在極短時間內獲取不同的隨機數 int32 random(int32 rand) { if( rand<=0 || rand>=65535) { return 1; } return getRandomValue()%rand; } //獲得一個在 [min,max]之間的隨機數 int32 randomInterval( int32 min, int32 max ) { int32 interval = max - min; if( interval <= 0 ) { return min; } else { return min + random( interval ); } }
這個方法雖然好,但有個前提需要用戶的操作,來獲取隨機數的內容,如果沒有操作,或者是程序一開始就需要隨機數呢?
1.4 我們可以自己做一個表來存儲一些隨機數,也就是說上例中的隨機數數組實現由程序員給出,
比如我們可以做一個2維數組
rand[20][20]={61987,2187,...5741,9871,..};
等等
或者將這些數寫到一個2進制文件中,
然後程序使用的時候只隨機一個起點,或者一個讀取規則縱向,橫向,斜向,回旋)等等,
這樣就可以在很短時間內做出來很多個不規則的隨機數啦!
本文出自 “鍵碼視窗” 博客,謝絕轉載!