作者etrexetrex (moonet)
看板Flash
標題Re: [問題] 請問測驗題想要隨機出現該怎麼做?
時間Thu Apr 3 02:00:30 2008
※ 引述《cjcat2266 (CJ Cat)》之銘言:
: ※ 引述《woodymonkey (小罐的吃太快)》之銘言:
: : 如果不出現一樣的問題:
: : 將所有的問題放在主場景的不同影格,
: : 然後產生一個陣列Array(20),用迴圈將隨機數字放入此陣列,
: : 陣列每一個元素內的數字注意不可重複。
: : 定義一個全域變數y,初始值為0。
: : 答對時用gotoAndPlay(Array(y)),並且將y加1。
: 想到另外一招
: 如果你有20格,就先讓個Array裝1~20
: var array:Array = new Array();
: for (var i:int = 0; i < 20; i++) {
: array[i] = i + 1;
: } //得到 [1, 2, 3, ..., 20]
: 然後用random決定這個Array裡面的一個數字
: 用過之後就把這個數字從Array裡面拔掉
: 之後再random決定的時候就絕對不會選到這個數字
: if (array.length == ) {
: //沒題目了,跳到結尾
: }
: var targetFrame:int = array[Math.floor((Math.random() * array.length))];
: array = array.splice(targetFrame, 1); //拔掉用過的數字
: gotoAndPlay(targetFrame);
其實產生不重複亂數有一個幾乎是最佳解的方法
//設定值
var array:Array = new Array();
for (var i = 0 ; i< 20 ; i++)
array[i] = i;
//亂數選擇排序
for (var i = 0 ; i <19 ; i++)
{
//選擇 從 i 到 19 中選擇一個
var rand = int(Math.random()*(20-i)) + i;
//交換
var temp = array[i];
array[i] = array[rand];
array[rand]=temp;
}
沒編譯過,但邏輯上就是這樣
請把程式碼當虛擬碼看看就好
如果真的可以執行,那只是湊巧
--
http://etrex.blogspot.com/
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.231.71.124
推 no1kk:這好像是所謂的洗牌原理,把52張牌順序攪亂之後再依序發牌 04/03 03:31
→ no1kk:只是在取亂數的時候不用限制取i~19,直接random(20)就好了 04/03 03:32
→ etrexetrex:洗牌的方法 是說洗越多次會越亂 但這個不是 04/03 09:50
→ etrexetrex:這個保證是真正亂的 04/03 09:50
→ etrexetrex:邏輯上來講 這演算法比較接近排序 04/03 09:53
推 aquarianboy:小的在1950篇就有附個原始檔囉,供大家參考 :) 04/03 11:41