隨機數,也就是在不同的時刻產生不同的數值。
在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 <stdio.h>
#include <time.h>
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
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 ;
}執行結果:

