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 次后它只显示一次)但也许有更好的方法来去做这个?

4

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 回答