4-3 不重複隨機亂數

亂數的應用很多,尤其在遊戲或者測驗設計更離不開亂數。Flash產生亂數的方法是Math.random( ),它會產生一個0~1之間虛擬亂數。本節介紹一種演算法,來產生不重複亂數。

一、        產生不重複亂數演算法

 

1015之間,取出3個不重複整數。

使用data1, data2,data33個變數,準備存放不重複亂數用。

data1

data2

data3

使用t1, t2, , t66個暫存變數,存放1015之間所有整數。

 10(t1)

11(t2)

12(t3)

13(t4)

14(t5)

15(t6)

反覆執行步驟143次。

1. 第一次由t1~t6中,隨機取一個隨數值,假設為t4=13)。第二次由t1 ~ t5中,隨機取一個隨數值。

2. 將此隨數值(13)給data1(第一次),data2(第二次),data3(第三次)。

3. t4後面變數值移給前面變數值,即t4=t5t5=t6

4. 回到步驟1.t的變數少一個。

結束

第一次假設隨機取出t4(=13),執行後結果如下:

13(data1)

(data2)

(data3)

 

10(t1)

11(t2)

12(t3)

14(t4)

15(t5)

(t6)

第二次假設隨機取出t5=15),執行後結果如下:

13(data1)

15(data2)

(data3)

 

10(t1)

11(t2)

12(t3)

14(t4)

(t5)

(t6)

第三次假設隨機取出t1=10),執行後結果如下:

13(data1)

15(data2)

10(data3)

 

11(t1)

12(t2)

14(t3)

(t4)

(t5)

(t6)

 

100120之間取出5個不重複整數

結果:本程式連續執行兩次結果。

 

 

 

 

 

 

 

 

 

 

 


程式:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

function GenRnd( min, max, rnd_no ){

tot_no = max - min + 1;

for( i = 1; i <= tot_no; i++ ){

this[ "t" + i ] = min + i - 1;

}

rem_no = tot_no;

for( i = 1; i <= rnd_no; i++){

t_no = math.floor( math.random() * rem_no + 1 );

this[ "data" + i ] = this[ "t" + t_no ]  ;

for( j = t_no; j<= (rem_no - 1); j++ ){

this[ "t" + j ] = this[ "t" + ( j  + 1 )];

}

rem_no--;

}

}

GenRnd(100,120,5);

for(i=1;i<=5;i++){

trace(this["data"+i])

}

trace("______");

解說:

0115GenRnd為「不重複隨機亂數」函數。

01min為最小整數,max為最大整數,rnd_no為亂數個數。

02minmax有多少個整數 tot_no

0305:將minmax之間所有整數存放於t1,t2,,t( tot_no ) 變數中。

0714:輸出rnd_no個到data中。

0809:由t1,t2,,t( rem_no)隨機取一個t(t_no)存於data(i)中。

1012:將t(t_no)以後資料往前移。

13:還剩下rem_not變數可以被選取。

16:利用「不重複隨機亂數」函數,在100120之間輸出5個整數存於data1,data2,.data5變數中。

1719:輸出data1,data2,data5變數內容。

20:間隔兩次輸出資料。