2

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)

このコードは、目的の値を含む配列を含む配列を作成しますが、明らかに必要なものではなく、適切な方法でそれを行う方法がわかりません。

4

1 に答える 1

1

あなたが探しているのは次のようなものだと思います:

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

ただし、個人的には、このパスがより単純なコードにつながるとはまったく思いません (あなたが到達しようとしていたように)。2 つの for ループを使用した最初の例は単純で、すべてのプログラマーが直接理解できます。私はそれに固執します。

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

また、これらのソリューションによって生成された Javascript コードを見ると、二重の for ループはそれほど複雑ではないことに注意してください。

于 2012-11-25T15:53:59.323 に答える