这是我需要做的,我将同时在PHP和JavaScript中进行操作。
我有一个数字列表,范围从1到300-500(我尚未设置限制)。我将运行一个绘图,将从给定范围内随机选取10个数字。
这是棘手的部分:我希望减少一些数字的编制。一小部分300-500将被标记为“幸运数字”。
例如,在100张图纸中,大多数数字都有相等的被抽奖机会,只有少数几率,每30至50张图纸只能被抽取一次。
基本上,我需要人为设置某些数字的概率,同时与其余数字保持均匀分布。
到目前为止,我发现的唯一类似的问题是这个问题:生成加权随机数,问题是我的规范具有更多的数字(最多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));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句