2012-11-25 47 views
2

我想在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]; 

當然,我可以在一個不是很優雅的方式來創建它(不變量初始化):

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) 

此代碼在其中創建一個數組與數組wi希望的價值觀,但不是我想要的明顯,而且我不知道如何以一種很好的方式做到這一點。

回答

1

我想你在找什麼是一樣的東西:

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

不過,我個人並不認爲這條道路通向簡單的代碼在所有(爲你寫你試圖達到)。所有程序員都可以簡單直接地理解你的第一個循環。我會堅持這一點。

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

另請注意,如果您查看由這些解決方案生成的Javascript代碼,則double for循環會複雜得多。