簡體   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