2

何か (「ターゲット」) がランダムな順序で (合計 10 回のうち) 5 回表示されるようにします。

以下のコードの問題は、ランダムな順序で表示できることですが、必ずしも 5 回表示されるとは限りません。

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回しか表示されなかった場合)が、おそらくもっと良い方法がありますこれを行うには?

4

1 に答える 1

1

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];
于 2012-07-23T17:16:54.537 に答える