繁体   English   中英

coffeescript加权随机数

[英]coffeescript weighted random number

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

这段代码创建了一个带有所需值的Array的Array,但这显然不是我想要的,而且我不知道如何以一种不错的方式做到这一点。

我认为您正在寻找的是这样的:

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代码,则double for循环的复杂度要低得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM