อัลกอริทึมที่สุ่มนำตัวเลขที่ใหญ่กว่ามาจากอาร์เรย์

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