2

我想在 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)

这段代码创建了一个数组,其中包含所需的值,但显然不是我想要的,我不知道如何以一种好的方式做到这一点。

4

1 回答 1

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 循环要简单得多。

于 2012-11-25T15:53:59.323 回答