javascript - 随机从数组中获取更大数字的算法
问题描述
我做了研究,发现了一般的小列表算法。我有一些数组,例如:
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。
通常解决方案类似于本主题。但是,这可能会导致我的阵列出现性能问题。
我怎样才能做到这一点?
解决方案
您可以计算概率并选择值。
将其与自定义数组一起使用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; }
推荐阅读
- php - PHP发送推送通知连接失败:111连接被拒绝
- android - 在给定名称/Google Maps URL 的地方放置位置图钉?
- pandas - 使用 pandas 从 csv 文件加载数据
- qt - 在 WebEngineView qml 中获取光标位置
- angular - 我应该在哪个模块中声明 Angular 指令?
- mysql - 如何将查询作为sql中的参数传递到存储过程
- azure-data-factory-2 - 枚举 Azure 数据工厂 v2 中的 blob 名称
- sapui5 - OData 模型版本控制
- tdd - TDD 中的实现和生产意味着什么
- amazon-s3 - 如何使用 AWS S3 作为视频源在 Youtube 上上传视频