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