程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 高質量的C代碼.關於獲取隨機數.20010704

高質量的C代碼.關於獲取隨機數.20010704

編輯:關於C語言

 

高質量的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進制文件中,
然後程序使用的時候只隨機一個起點,或者一個讀取規則縱向,橫向,斜向,回旋)等等,
這樣就可以在很短時間內做出來很多個不規則的隨機數啦!

本文出自 “鍵碼視窗” 博客,謝絕轉載!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved