首页 > 解决方案 > 随机从数组中获取更大数字的算法

问题描述

我做了研究,发现了一般的小列表算法。我有一些数组,例如:

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。

如何生成元素的随机加权分布

通常解决方案类似于本主题。但是,这可能会导致我的阵列出现性能问题。

我怎样才能做到这一点?

标签: javascriptarraysalgorithmrandom

解决方案


您可以计算概率并选择值。

将其与自定义数组一起使用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; }


推荐阅读