4-3 不重複隨機亂數
亂數的應用很多,尤其在遊戲或者測驗設計更離不開亂數。Flash產生亂數的方法是Math.random( ),它會產生一個0~1之間虛擬亂數。本節介紹一種演算法,來產生不重複亂數。
一、 產生不重複亂數演算法
在10∼15之間,取出3個不重複整數。
使用data1, data2,data3等3個變數,準備存放不重複亂數用。
data1 |
data2 |
data3 |
使用t1, t2, …, t6等6個暫存變數,存放10∼15之間所有整數。
10(t1) |
11(t2) |
12(t3) |
13(t4) |
14(t5) |
15(t6) |
反覆執行步驟1∼4共3次。
1. 第一次由t1~t6中,隨機取一個隨數值,假設為t4(=13)。第二次由t1 ~ t5中,隨機取一個隨數值。
2. 將此隨數值(13)給data1(第一次),data2(第二次),data3(第三次)。
3. 將t4後面變數值移給前面變數值,即t4=t5,t5=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) |
|||
在100∼120之間取出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("______"); |
解說:
行01∼15:GenRnd為「不重複隨機亂數」函數。
行01:min為最小整數,max為最大整數,rnd_no為亂數個數。
行02:min∼max有多少個整數 tot_no。
行03∼05:將min到max之間所有整數存放於t1,t2,…,t( tot_no ) 變數中。
行07∼14:輸出rnd_no個到data中。
行08∼09:由t1,t2,…,t( rem_no)隨機取一個t(t_no)存於data(i)中。
行10∼12:將t(t_no)以後資料往前移。
行13:還剩下rem_no個t變數可以被選取。
行16:利用「不重複隨機亂數」函數,在100∼120之間輸出5個整數存於data1,data2,….data5變數中。
行17∼19:輸出data1,data2,…data5變數內容。
行20:間隔兩次輸出資料。