这是我需要做的,我将同时使用 PHP 和 JavaScript 来完成。
我有一个数字列表,范围从 1 到 300-500(我还没有设置限制)。我将运行一个绘图,从给定范围内随机选择 10 个数字。
这是棘手的部分:我希望一些数字不太可能被拟定。这 300-500 个中的一小部分将被标记为“幸运数字”。
例如,在 100 张图纸中,大多数数字被抽取的机会均等,除了少数,每 30-50 张图纸只会被抽取一次。
基本上我需要人为设置某些数字被选中的概率,同时保持与其余数字的均匀分布。
到目前为止我发现的唯一相似的是这个问题:Generate A Weighted Random Number ,问题是我的规范有相当多的数字(最多 500),所以权重会变得非常小,据推测这可能是该解决方案(拒绝抽样)的问题。不过,我仍在尝试,但我想知道是否还有其他解决方案。
数学不是我的专长,所以我很感激任何意见。谢谢。
最佳答案
我写了一个快速的小 JSFiddle 来处理这个:
基本上,我生成一个名为 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/