程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言之實現隨機數產生算法

C語言之實現隨機數產生算法

編輯:關於C

隨機數,也就是在不同的時刻產生不同的數值。在UNIX操作系統和window的操作系統上,我們知道有一個函數rand,它就是用來產生隨機數的函數API接口,那麼它的原理如何實現?

如果約定a1=f(seed),an+1=f(an),那麼可以得到一個序列a1,a2,a3..an,那麼要制作一個偽隨機函數rand,只需要讓它每調用一次就返回序列的下一個元素就行。其實就是相當於第1次調用rand返回a1,第2次返回a2,…,第n次返回an,這樣每次返回的數值都不一樣,也就是相當於隨機數了。但是其實不是真正的隨機數,真正的隨機數是使用物理現象產生的:比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等等。這樣的隨機數發生器叫做物理性隨機數發生器,它們的缺點是技術要求比較高。

在當前的計算機領域,許許多多的隨機數算法正是基於這樣的原理產生,一般情況下我們在平時使用rand函數的時候,需要種鐘子,也就是種隨機數種子,確保每一次產生的數值不一樣。這時候我們需要一個srand()的函數,然後在一定的時間裡time()函數產生不同的序列。

一般在寫的時候是這樣:srand(time(NULL)) ;這樣就相當於種種子。接下來我們來看一下具體的代碼:

 

#include 
#include 
static unsigned int randseed;
/* 實現偽隨機數的支持 */
unsigned int Curl_rand(void)
{
  unsigned int r;
  /* 返回一個無符號32位整型的偽隨機數. */
  r = randseed = randseed * 1103515245 + 12345;
  return (r << 16) | ((r >> 16) & 0xFFFF);
}

void Curl_srand(void)
{
  /* 產生隨機的偽隨機數序列。 */
  randseed = (unsigned int) time(NULL);
  Curl_rand();
  Curl_rand();
  Curl_rand();
}

int main(void)
{
	srand();
	unsigned int i ;
	int j = 10;
	printf("產生10個隨機數:\n");
	while(j != 0){
		i = Curl_rand() % 100 ;
		printf("i:%d\n",i);
		j-- ;
	}
	return 0 ; 
} 
執行結果:

\
如果不用這樣的算法,我們調用系統實現的接口是這樣:

#include 
#include 
#include 

int main(void)
{
	//種種子 
	srand(time(NULL));
	int i ;
	int j ;
	for(i = 0 ; i < 10 ; i ++)
	{
		//產生10個100以內的隨機數 
		j = rand()%100 ;
		printf("j:%d\n",j);
	} 
	return 0 ;
}
運行結果:

\

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