国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

規(guī)定范圍內(nèi)一定數(shù)量無(wú)重復(fù)隨機(jī)數(shù)的產(chǎn)生算法及應(yīng)用

2012-10-16 11:34:52謝春祥張兆亮
關(guān)鍵詞:數(shù)組代碼算法

謝春祥,張兆亮

(蚌埠學(xué)院,安徽蚌埠233030)

規(guī)定范圍內(nèi)一定數(shù)量的隨機(jī)數(shù)的產(chǎn)生在生產(chǎn)研究中有著廣泛的應(yīng)用.通常的隨機(jī)數(shù)產(chǎn)生方法是重復(fù)進(jìn)行生成操作,直到產(chǎn)生足夠數(shù)量的隨機(jī)數(shù)為止.并且為了防止重復(fù),還要不斷掃描對(duì)比己經(jīng)生成的隨機(jī)數(shù).這樣效率很低,而且可能陷入死循環(huán)(一直產(chǎn)生不了合格的隨機(jī)數(shù),程序持續(xù)空轉(zhuǎn))[1-6].本文提出通過(guò)“下標(biāo)填充補(bǔ)尾法”,可以有效解決通常方法的弊端,達(dá)到高效可靠的目的.

1 通常產(chǎn)生規(guī)定范圍隨機(jī)數(shù)的方法

要生成符合要求的隨機(jī)數(shù),通常都是先產(chǎn)生一般的隨機(jī)數(shù),再通過(guò)特定的方法從中挑選所需要的數(shù).普通隨機(jī)數(shù)的產(chǎn)生常用的rand()函數(shù)實(shí)現(xiàn),例如,要生成一個(gè)值在區(qū)間[1,N]內(nèi)的隨機(jī)數(shù)R,代碼如下:

srand((unsigned)time(NULL));

R=rand()%(N+1);

第1行代碼是給隨機(jī)數(shù)函數(shù)賦一個(gè)種子值,以便隨機(jī)函數(shù)在此基礎(chǔ)上遞推出隨機(jī)數(shù)來(lái).這里用不斷變化的計(jì)算機(jī)時(shí)間做種子.在第2行代碼里,由rand()函數(shù)產(chǎn)生一個(gè)隨機(jī)數(shù).但由于rand()的返回值在0~327 67之中(一個(gè)short整型數(shù)值的范圍),所以當(dāng)N值小于327 67時(shí),就要將返回值模(N+1)取余,以使值的范圍一定落在[1,N]中.如果要取的隨機(jī)數(shù)值大于327 67,則可由多個(gè)rand()的返回值進(jìn)行線性疊加獲得[2].一定范圍內(nèi)隨機(jī)數(shù)產(chǎn)生了,下面著重探討如何產(chǎn)生規(guī)定數(shù)量的隨機(jī)數(shù).

2 下標(biāo)填充法產(chǎn)生隨機(jī)數(shù)

假設(shè)要產(chǎn)生M個(gè)值在區(qū)間[1,N]的隨機(jī)數(shù).常用的方法就是重復(fù)執(zhí)行上面所說(shuō)的兩行代碼,直到產(chǎn)生M個(gè)滿足條件的隨機(jī)數(shù)為止[3-5].但這樣做將要花費(fèi)大量的時(shí)間,尤其是當(dāng)M和N很接近時(shí),而且難以滿足無(wú)重復(fù)的要求.所以必須找一個(gè)新的高效數(shù)法,從根本上解決這個(gè)問(wèn)題.這就是下標(biāo)填充補(bǔ)尾法.

先定義一個(gè)長(zhǎng)度N的一維數(shù)組,名為A n,將初值全設(shè)為0,數(shù)組下面的格子中顯示的是他們的下標(biāo);再定義一個(gè)長(zhǎng)度為M的一維數(shù)組B m.

數(shù)組A n(注意:是一維數(shù)組,下一行是每個(gè)元素的位置)

0 1 0 2 3 3 0 4 0 5 6 6 0 7…………0 N-1 0 N

數(shù)組B m

…………M-1 M 6 1 3 2 3 4 5 6 7

算法代碼如下:

設(shè)一個(gè)重復(fù)操作的閥值S,令S=3N;

int S=3N;

IA=1;//給數(shù)組An位置指示賦初值

IB=1;//給數(shù)組An位置指示賦初值,讓其指在位置1處

srand((unsigned)time(NULL));//給隨機(jī)函數(shù)設(shè)定種子

for(int d=0;d<S;d++)//重復(fù)最多S次循環(huán)

{

R=rand()%(N+1);//產(chǎn)生一個(gè)值[1,N]的隨機(jī)數(shù) R

If(An[R]==0)//判斷數(shù)組下標(biāo)為R的元素的值是否為零,如果是則繼續(xù)

{

An[R]=R;//將A n[R]的下標(biāo)值賦給它,這就是所謂的下標(biāo)填充

Bm[IB]=R;//并且把R值依次放到數(shù)組B m中

IB++;//把數(shù)組B m的元素位置指示加1;

if(IB>M){break;}//如果己產(chǎn)生M個(gè)隨機(jī)數(shù)則跳出,否則繼續(xù)

}

}

上面這段代碼就是最多以S次循環(huán)來(lái)生成所要求的隨機(jī)數(shù),令S=3N的原因?yàn)閞and()返回值是均勻分布的,因此S=3N次將基本使其返回值遍布在[0,N]區(qū)間上.

通過(guò)下標(biāo)填充的方式產(chǎn)生一個(gè)隨機(jī)數(shù)R,判斷隨機(jī)數(shù)R是否己經(jīng)被采納.如果尚未被采納,則將隨機(jī)數(shù)R保存起來(lái),并把A n[R]值設(shè)為R.通過(guò)這種方法來(lái)保證獲得不重復(fù)的隨機(jī)數(shù)[6].例如先產(chǎn)生第一個(gè)隨機(jī)數(shù)6.便令A(yù) n[6]=6,并令B m中還沒(méi)有賦值的第一個(gè)元素的值為6.第二個(gè)產(chǎn)生的隨機(jī)數(shù)是3,同樣就有A n[3]=3,B m[2]=3.以此類推,直到產(chǎn)生足夠數(shù)量的隨機(jī)數(shù).

3 用補(bǔ)尾法補(bǔ)充剩下的隨機(jī)數(shù)

一般情況下M次循環(huán)就可以產(chǎn)生大多數(shù)符合要求的隨機(jī)數(shù).但是rand()%(N+1)畢竟只是一個(gè)隨機(jī)的結(jié)果,當(dāng)N比較大,而M又和N比較接近時(shí),從概率上來(lái)講,生成M個(gè)隨機(jī)數(shù)時(shí)間就會(huì)增加許多,因?yàn)橐h(huán)更多次數(shù)才行.而這樣做效率太低,因?yàn)樾枰a(chǎn)生的隨機(jī)數(shù)個(gè)數(shù)已經(jīng)很有限了,因此就可以使用補(bǔ)尾法來(lái)解決這個(gè)問(wèn)題.由于沒(méi)有產(chǎn)生足夠數(shù)量符合求隨機(jī)數(shù),數(shù)組B m的后幾位元素還沒(méi)有賦值.掃描A n數(shù)組,順序隨意,這里從前往后掃描.當(dāng)發(fā)現(xiàn)有元素A n[IA]位置的值為零時(shí),即令A(yù)[IA]=IA,同時(shí)將IA賦給B m尚未賦值的元素,重復(fù)操作直到B m被填滿為止.這就是補(bǔ)尾法.即把B m中尚未賦值的尾巴,依次補(bǔ)上A n中尚未被填充元素的下標(biāo)值.通過(guò)使用補(bǔ)尾法,可以有效地縮短循環(huán)次數(shù),并可杜絕死循環(huán)產(chǎn)生的情形.

下面給出補(bǔ)尾的算法的代碼:

if(IB<M)

{

for(IA=1;IA<=N;IA++)

{

if(An[IA]==0)

{Bm[IB]=i;

if(IB>=M){break;}

IB++;

}

}

把下標(biāo)填充生成部分和后面的補(bǔ)尾生成部分結(jié)合起來(lái),就成了“下標(biāo)填充補(bǔ)尾法”.

4 算法效率驗(yàn)證

4.1 實(shí)驗(yàn)環(huán)境

Windows XP,C++Builder 6.0.

4.2 實(shí)驗(yàn)方法

在[1,10 000]區(qū)間上,產(chǎn)生M個(gè)隨機(jī)數(shù),按照通常方法和下標(biāo)填充補(bǔ)尾法執(zhí)行,重復(fù)3次.

4.3 實(shí)驗(yàn)結(jié)果和分析

實(shí)驗(yàn)結(jié)果見(jiàn)表1.

表1 不同算法的循環(huán)次數(shù)

由表1可知,對(duì)比于通常方法,在M值很大時(shí),下標(biāo)填充補(bǔ)尾法的效率有明顯改善.由于S的閥值作用,使生成供挑選隨機(jī)數(shù)的循環(huán)次數(shù)大幅度減小.而當(dāng)M較小時(shí)和通常方法的循環(huán)次數(shù)相當(dāng),這一點(diǎn)保證了在M較小時(shí)生在隨機(jī)數(shù)的有充分的隨機(jī)性.

5 算法應(yīng)用

利用下標(biāo)填充補(bǔ)尾法,保證了無(wú)重復(fù)隨機(jī)數(shù)的高效產(chǎn)生.下面通過(guò)實(shí)例驗(yàn)證了這種算法在實(shí)踐中的典型應(yīng)用.

應(yīng)用一:從有N道試題的題庫(kù)中,隨機(jī)生成擁有M道試題的試卷.如果M<N,則生成試卷.如果M≥N,則直接把所有的試題全選即可.全選時(shí),沒(méi)有考虙排序的問(wèn)題.但有些應(yīng)用卻要求打亂順序,這時(shí)可以用下標(biāo)填充補(bǔ)尾法生成所要的隨機(jī)序列.

應(yīng)用二:發(fā)牌問(wèn)題,即如何把撲克牌以高效的方法隨機(jī)派發(fā).現(xiàn)在以52張牌分發(fā)給甲、乙、丙、丁4個(gè)人為例,這就相當(dāng)于把52個(gè)數(shù)進(jìn)行隨機(jī)分配

令 N=52,M=39;(52-52/4=39);則有數(shù)組 A52,B39

當(dāng)產(chǎn)生了39個(gè)隨機(jī)數(shù)后,數(shù)組B39己經(jīng)填滿了,這時(shí)數(shù)組A52里還有13個(gè)元素沒(méi)有被選中,把這13個(gè)元素全部給“丁”;再把數(shù)組B39中的元素平分成三段,依次派給“甲”、“乙”、和“丙”.問(wèn)題解決.

應(yīng)用三:學(xué)生分班問(wèn)題,新生入學(xué)時(shí),涉及到隨機(jī)分班.為了使各班級(jí)相對(duì)平衡,這要要求分班時(shí)能真正的隨機(jī).如有300人入學(xué),需要分到10個(gè)班.這就相當(dāng)于把300個(gè)數(shù)隨機(jī)分配.令N=300,M=270;計(jì)算方法同上.

6 結(jié)論

本文探討了一種新的一定范圍內(nèi)的無(wú)重復(fù)隨機(jī)數(shù)的產(chǎn)生算法——下標(biāo)填充補(bǔ)尾法.這種算法具有高效和可靠的特點(diǎn),提高了生成速度并有效地避免了死循環(huán)的產(chǎn)生.實(shí)驗(yàn)證明,產(chǎn)生規(guī)定范圍內(nèi)無(wú)重復(fù)的隨機(jī)數(shù),使用這種算法與通常方法相比較,隨機(jī)數(shù)數(shù)量越接近區(qū)間值,效率提升越明顯.

[1]Hellekalek P.Good random number generators are(not so)easy to find[J].Mathematics and Computers in Simulation,1998,46(5/6):485-505.

[2]Gonzalez J A,Pino R.A random number generator based on unpredictable chaotic functions[J].Computer Physics Communications,1999,120:109-114.

[3]Pang W K,Yang Z H,Hou S H.The vertical strip method for generation of random number with given density[J].European Journal ofOperation Research,2002,142(3):5952609.

[4]Fang K T,Yang Z H,Samuel K.Generation ofmultivariate distribut ions by vertical density rep resentat ion[J].Stat ist ics,2001,35:2812293.

[5]Bailey R W.Polar generation of random variates with the distribution[J].Mathematics ofComputation,1994,62:7792781.

[6]楊自強(qiáng),魏公毅.產(chǎn)生偽隨機(jī)數(shù)的若干新方法[J].數(shù)值計(jì)算與計(jì)算機(jī)應(yīng)用,2001,22(3):202-216.

猜你喜歡
數(shù)組代碼算法
JAVA稀疏矩陣算法
JAVA玩轉(zhuǎn)數(shù)學(xué)之二維數(shù)組排序
基于MapReduce的改進(jìn)Eclat算法
Travellng thg World Full—time for Rree
進(jìn)位加法的兩種算法
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
一種改進(jìn)的整周模糊度去相關(guān)算法
邵阳县| 灯塔市| 三门峡市| 乡城县| 万州区| 上栗县| 乌苏市| 红安县| 宝鸡市| 阜阳市| 和硕县| 兴城市| 化州市| 沙雅县| 肥乡县| 明水县| 新沂市| 绩溪县| 沾化县| 桐柏县| 临安市| 珲春市| 长丰县| 临颍县| 上高县| 海兴县| 绵阳市| 梁山县| 专栏| 巩义市| 昌江| 宁陵县| 布尔津县| 璧山县| 孟连| 偃师市| 开远市| 客服| 石家庄市| 兴化市| 城市|