隨機(jī)數(shù)算法是什么?
在計(jì)算機(jī)中并沒有一個(gè)真正的隨機(jī)數(shù)發(fā)生器,但是可以做到使產(chǎn)生的數(shù)字重復(fù)率很低,這樣看起來好象是真正的隨機(jī)數(shù),實(shí)現(xiàn)這一功能的程序叫偽隨機(jī)數(shù)發(fā)生器。 有關(guān)如何產(chǎn)生隨機(jī)數(shù)的理論有許多如果要詳細(xì)地討論,需要厚厚的一本書的篇幅。不管用什么方法實(shí)現(xiàn)隨機(jī)數(shù)發(fā)生器,都必須給它提供一個(gè)名為“種子”的初始值。而且這個(gè)值最好是隨機(jī)的,或者至少這個(gè)值是偽隨機(jī)的。“種子”的值通常是用快速計(jì)數(shù)寄存器或移位寄存器來生成的。 下面講一講在C語言里所提供的隨機(jī)數(shù)發(fā)生器的用法?,F(xiàn)在的C編譯器都提供了一個(gè)基于ANSI標(biāo)準(zhǔn)的偽隨機(jī)數(shù)發(fā)生器函數(shù),用來生成隨機(jī)數(shù)。它們就是rand()和srand()函數(shù)。這二個(gè)函數(shù)的工作過程如下:”) 首先給srand()提供一個(gè)種子,它是一個(gè)unsigned int類型,其取值范圍從0~65535; 2) 然后調(diào)用rand(),它會(huì)根據(jù)提供給srand()的種子值返回一個(gè)隨機(jī)數(shù)(在0到32767之間) 3) 根據(jù)需要多次調(diào)用rand(),從而不間斷地得到新的隨機(jī)數(shù); 4) 無論什么時(shí)候,都可以給srand()提供一個(gè)新的種子,從而進(jìn)一步“隨機(jī)化”rand()的輸出結(jié)果?!∵@個(gè)過程看起來很簡(jiǎn)單,問題是如果你每次調(diào)用srand()時(shí)都提供相同的種子值,那么,你將會(huì)得到相同的隨機(jī)數(shù)序列,這時(shí)看到的現(xiàn)象是沒有隨機(jī)數(shù),而每一次的數(shù)都是一樣的了。例如,在以17為種子值調(diào)用srand()之后,在首次調(diào)用rand()時(shí),得到隨機(jī)數(shù)94。在第二次和第三次調(diào)用rand()時(shí)將分別得到26602和30017,這些數(shù)看上去是很隨機(jī)的(盡管這只是一個(gè)很小的數(shù)據(jù)點(diǎn)集合),但是,在你再次以17為種子值調(diào)用srand()后,在對(duì)于rand()的前三次調(diào)用中,所得的返回值仍然是在對(duì)94,26602,30017,并且此后得到的返回值仍然是在對(duì)rand()的第一批調(diào)用中所得到的其余的返回值。因此只有再次給srand()提供一個(gè)隨機(jī)的種子值,才能再次得到一個(gè)隨機(jī)數(shù)?!∠旅娴睦佑靡环N簡(jiǎn)單而有效的方法來產(chǎn)生一個(gè)相當(dāng)隨機(jī)的“種子”值----當(dāng)天的時(shí)間值:g#椋睿悖歟酰洌澹Γ歟?;stdieP瑁Γ紓?; #ince酰洌澹Γ歟?;stde椋猓瑁Γ紓?;?。#椋睿悖歟酰洌澹Γ歟?;sys&#4AP唬簦穡澹螅瑁Γ紓?; #ince酰洌澹Γ歟?;sys&#4AP唬簦椋恚澹猓瑁Γ紓簦弧。觶錚椋洹。恚幔椋睿ǎ觶錚椋洌。。椋睿簟。?; unsi<傤ed?。椋睿簟。螅澹澹洌鄭幔歟弧。螅簦潁酰悖簟。簦椋恚澹狻。簦椋恚澹攏酰媯弧。媯簦椋恚澹ǎΓ幔恚穡唬簦椋恚澹攏酰媯弧。螅澹澹洌鄭幔歟劍ǎǎǎǎ酰睿螅椋紓睿澹洹。椋睿簦簦椋恚澹攏酰媯簦椋恚澹Γ幔恚穡唬埃疲疲疲疲。ǎ酰睿螅椋紓睿澹洹。椋睿簦簦椋恚澹攏酰媯恚椋歟歟椋簦恚蕖。ǎ酰睿螅椋紓睿澹洹。椋睿簦簦椋恚澹攏酰媯恚椋歟歟椋簦恚?; s}幔睿洌ǎǎ酰睿螅椋紓睿澹洹。椋睿簦螅澹澹洌鄭幔歟?;?。媯錚潁ǎ椋劍?;i&e?;10;++i) 7w潁椋睿簦媯ǎΓ瘢酰錚?;%6d\n&queP?;begjrand());?。∩厦娴某绦蛳仁钦{(diào)用_ftime()來檢查當(dāng)前時(shí)間yc并把它的值存入結(jié)構(gòu)成員timeBuf.time中wae當(dāng)前時(shí)間的值從1970年1月1日開始以秒計(jì)算aeh在調(diào)用了_ftime()之后在結(jié)構(gòu)timeBuf的成員millitm中還存入了當(dāng)前那一秒已經(jīng)度過的毫秒數(shù),但在DOS中這個(gè)數(shù)字實(shí)際上是以百分之一秒來計(jì)算的。然后,把毫秒數(shù)和秒數(shù)相加,再和毫秒數(shù)進(jìn)行異或運(yùn)算。當(dāng)然也可以對(duì)這兩個(gè)結(jié)構(gòu)成員進(jìn)行更多的計(jì)算,以控制