Algoritma yang secara acak memunculkan lebih banyak bilangan yang lebih besar dari sebuah larik

Aug 19 2020

Saya melakukan penelitian dan menemukan algoritme untuk daftar kecil secara umum. Saya memiliki beberapa array seperti:

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

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

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

Saya ingin mengirim array ini ke suatu fungsi dan mendapatkan nomor acak dari array ini, tetapi saya ingin memiliki probabilitas yang lebih tinggi untuk mendapatkan angka yang lebih besar setiap saat.

Misalnya pada larik 1, probabilitas 96 harus lebih dari 4, tetapi probabilitas 97 harus lebih dari 96.

Cara menghasilkan distribusi elemen berbobot acak

Biasanya solusinya seperti di topik ini. Namun, ini dapat menyebabkan masalah kinerja dengan array saya.

Bagaimana saya bisa mencapai itu?

Jawaban

2 NinaScholz Aug 19 2020 at 15:29

Anda dapat menghitung probabilitas dan memilih nilainya.

Untuk menggunakannya dengan pengambilan larik khusus random

getRandomValue = random(sortedArray),

dan kemudian dalam satu lingkaran

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; }