[英]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.