半控制随机结果

时间:2012-07-23 17:10:52

标签: actionscript-3 random

我希望以随机顺序出现五次(“目标”)(总共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 个答案:

答案 0 :(得分:1)

一个简单的解决方案:使用正确数量的所需目标创建可能性列表。

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

创建它的副本,在选择时删除每个项目。一旦你全部拉了10,就重新复制清单。


或者,你可以通过用5'b播种它来创建这个列表,随机选择5'a','c'或'd',然后让你的列表随机选择,如果你不喜欢我希望非'''计数保持一致。

生成随机项目数组:

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];