配列からより大きな数値をランダムに取得するアルゴリズム

Aug 19 2020

私は調査を行い、一般的に小さなリストのアルゴリズムを見つけました。私はそのようないくつかの配列を持っています:

arr = [1,2,3,4 .... , 96,97,98,99,100];

arr2 = [105, 110, 165, 170];

arr3 = [1,2,7,8,9];

これらの配列を関数に送信し、この配列から乱数を取得したいのですが、毎回大きな数を取得する可能性を高くしたいと思います。

たとえば、配列1では、96の確率は4より大きくなければなりませんが、97の確率は96より大きくなければなりません。

要素のランダムな加重分布を生成する方法

通常、解決策はこのトピックのようなものです。ただし、これにより、アレイのパフォーマンスに問題が発生する可能性があります。

どうすればそれを達成できますか?

回答

2 NinaScholz Aug 19 2020 at 15:29

確率を計算して値を選ぶことができます。

カスタム配列で使用するには、 random

getRandomValue = random(sortedArray),

そして後でループで

let value = getRandomValue();

const
    random = sortedValues => {
        let length = sortedValues.length,
            sum = length * (length + 1) / 2;

        return () => {
            let r = Math.random();
            return sortedValues.find((_, i) => (r -= (i + 1) / sum) <= 0);
        };
    },
    getRandomValue = random([6, 7, 8, 9, 10]),
    counts = {};

for (let i = 0; i < 1e6; i++) {
    let value = getRandomValue();
    counts[value] = (counts[value] || 0) + 1;
}

console.log(counts);
.as-console-wrapper { max-height: 100% !important; top: 0; }