gpt4 book ai didi

javascript - 从任意加权列表生成随机数

转载 作者:行者123 更新时间:2023-11-30 17:27:40 26 4
gpt4 key购买 nike

这是我需要做的,我将同时使用 PHP 和 JavaScript 来完成。

我有一个数字列表,范围从 1 到 300-500(我还没有设置限制)。我将运行一个绘图,从给定范围内随机选择 10 个数字。

这是棘手的部分:我希望一些数字不太可能被拟定。这 300-500 个中的一小部分将被标记为“幸运数字”。

例如,在 100 张图纸中,大多数数字被抽取的机会均等,除了少数,每 30-50 张图纸只会被抽取一次。

基本上我需要人为设置某些数字被选中的概率,同时保持与其余数字的均匀分布。

到目前为止我发现的唯一相似的是这个问题:Generate A Weighted Random Number ,问题是我的规范有相当多的数字(最多 500),所以权重会变得非常小,据推测这可能是该解决方案(拒绝抽样)的问题。不过,我仍在尝试,但我想知道是否还有其他解决方案。

数学不是我的专长,所以我很感激任何意见。谢谢。

最佳答案

我写了一个快速的小 JSFiddle 来处理这个:

http://jsfiddle.net/cHVsC/

基本上,我生成一个名为 pool 的数组,其中包含完整的数字列表,包括权重更高的数字的重复项。然后选择与非加权数组完全一样。

示例 JS:

function generatePool (count, luckyNumbers) {
var arr = [], i, j;
for (i = 1; i <= count; i++) {
if (luckyNumbers[i]) {
for (j = 0; j < luckyNumbers[i]; j++) {
arr.push(i);
}
} else {
arr.push(i);
}
}
return arr;
}

function randomNumber (pool) {
return pool[ Math.floor(Math.random() * pool.length) ];
}

和一个用法示例

var luckyNumbers = {};
luckyNumbers[13] = 10;
luckyNumbers[25] = 100;

var pool = generatePool(300, luckyNumbers);

alert(randomNumber(pool));

更新:我误解了最初的目标。这是一个更新版本:

function generatePool (count, luckyNumbers) {
var arr = [], i, j;
for (i = 1; i <= count; i++) {
for (j = 0; j < (luckyNumbers[i] || 10); j++) {
arr.push(i);
}
}
return arr;
}

function randomNumber (pool) {
return pool[ Math.floor(Math.random() * pool.length) ];
}

用法示例:

var luckyNumbers = {};
luckyNumbers[13] = 1; //-- ~1:10 odds
luckyNumbers[25] = 2; //-- ~2:10 odds

var pool = generatePool(300, luckyNumbers);

console.log(randomNumber(pool));

关于javascript - 从任意加权列表生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23899132/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com