coffeescript加权随机数

时间:2012-11-25 15:11:55

标签: javascript random coffeescript

我想在CoffeeScript中创建一个加权随机数生成器。

以下是Javascript代码:

// init
var chances = {
        red: 1,
        blue: 4,
        yellow: 10
    },
    bag = [];

// fill the bag with the values
for (var chance in chances) {
    for (var i=0; i<chances[chance]; ++i) {
        bag.push(chance);
    }
}

// get random element
var index   = Math.floor(Math.random()*bag.length,
    element = bag[index];

当然我可以用不太优雅的方式创建它(没有变量init):

for chance, value of chances
    for [1..value]
        bag.push(chance)

index   = Math.floor(Math.random()*bag.length;
element = bag[index];

我想简化代码,并创建最佳解决方案,但我被困住了:

bag = ((k for [1..v]) for k, v of chances)

这段代码使用所需的值创建一个带有数组的数组,但这显然不是我想要的,我不知道怎么做得很好。

1 个答案:

答案 0 :(得分:1)

我认为你所寻找的是:

bag = [].concat.apply [], ((k for [1..v]) for k, v of chances)

然而,就我个人而言,我认为这条道路根本不会导致更简单的代码(正如你所写的那样,你试图达到)。你的第一次使用两个for循环是简单的,所有程序员都可以直接理解。我会坚持下去。

for chance, value in chances
    for [1..value]
        bag.push chance

另请注意,如果您查看这些解决方案生成的Javascript代码,则for for循环要复杂得多。