2012-07-23 198 views
2

我希望某個東西(一個「目標」)以隨機順序顯示五次(共10次)。半控制隨機結果

與下面的代碼的問題是我能得到它以隨機順序顯示出來,但不一定五次:

function rand_float(min:Number,max:Number=NaN):Number { 
      if (isNaN(max)) { max = min; min=0; } 
      return Math.random()*(max-min)+min; 
} 

function rand_integer(min:Number,max:Number=NaN):int { 
     if (isNaN(max)) { max = min; min=0; } 
     return Math.floor(rand_float(min,max)); 
} 
function rand_boolean(chance:Number=0.5):Boolean { 
    return (Math.random() < chance); 
} 

var a_list:Array = ['a','b','d','e']; 

var target:String = 'b'; 

for (var i:int = 0; i < 10; i++) { 
    if (rand_boolean()) { 
     trace('random other thing: ' + a_list[rand_integer(0,3)]); 
    } else { 
     trace('target! :' + target); 
    } 
} 

因爲rand_boolean方法是50-50,它要麼「顯示, 「或」不顯示「,但不能保證它始終是10次中的5次。

我想我可以放一個計數器,然後限制它5次後(如果它結束)或強迫它顯示更多(如果說,8次後它只顯示一次),但是有沒有更好的方法去做這件事?

回答

1

一個簡單的解決方案:用正確數量的所需目標創建一個可能性列表。

['a','a','b','b','b','b','b','c','c','d'] 

創建它的副本,刪除每個項目,當你選擇它們。一旦你拉完所有10個,重新複製列表。


或者,您可以通過5種晶「B的,隨機5選擇‘A’,」 C」,或‘d’創建這個列表,然後你有你的清單,從隨機選擇,如果你不希望非'b'計數一致。

生成隨機項數組:

var targets:Array = ['b','b','b','b','b']; 
var options:Array = ['a','d','e']; 

var current:Array = new Array(targets); 

while (current.length < 10) 
{ 
    current.push(options[rand_integer(0,3)]); 
} 

,然後在隨機選擇:

var item:String; 
if (current.length == 0) 
    //regenerate array using above code 

//splice(index to start at, # of items to remove) returns an array, we grab the first (only) item in it 
item = current.splice(rand_integer(0,current.length),1)[0]; 
+0

由於這是偉大的。但對於第二個建議的解決方案......我不確定「播種」是如何工作的(在Google快速搜索之後),也許您可​​以展示代碼示例? – redconservatory 2012-07-23 17:31:06

+1

我投入了一個簡短的樣本。如果您需要更多解釋,請告訴我。 – 2012-07-23 17:44:21

+0

哇,這太好了,謝謝(不知道你可以複製一個數組,我想我必須克隆它)。 – redconservatory 2012-07-23 17:52:53