【问题标题】:Algorithm that randomly brings the bigger numbers more from an array随机从数组中获取更大数字的算法
【发布时间】:2020-12-08 11:09:09
【问题描述】:

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

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。

How to generate a random weighted distribution of elements

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

我怎样才能做到这一点?

【问题讨论】:

  • 为什么“96应该大于4”,和下一个至少是前任?
  • 数字之间的概率差异应该是多少?它是否应该等同于它们在排序数组中的索引?与1相比,100 被选中的可能性是 1 的 100 倍?
  • @NinaScholz 既然 96 大于 4,它应该更有可能出现。这只是一个例子。
  • @adiga 其实并没有这样的条件或要求。例如,虽然数组 3 中出现 1 的概率是 10%,但出现 9 的概率可能是 30%。这可能会有所不同。

标签: javascript arrays algorithm random


【解决方案1】:

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

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

【讨论】:

  • 不应该是probabilities = numbers.map((v, i) =&gt; (i+1) / sum)吗?假设您根据排序数组中的位置线性增加概率。
  • @adiga,是的,应该是。 (但都是一样的……)
  • 如何使用这些概率,例如数组 [16, 2, 5, 10]?四个项目,但最大的一个在索引 0 中。
  • 对,我以为 numbers 将成为输入数组,而您根据输入数组的值进行选择
  • @Zagano,在这种情况下,您需要一个排序数组。
猜你喜欢
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多