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

费尔南多

这是我需要做的,我将同时在PHP和JavaScript中进行操作。

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

这是棘手的部分:我希望减少一些数字的编制。一小部分300-500将被标记为“幸运数字”。

例如,在100张图纸中,大多数数字都有相等的被抽奖机会,只有少数几率,每30至50张图纸只能被抽取一次。

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

到目前为止,我发现的唯一类似的问题是这个问题:生成加权随机数,问题是我的规范具有更多的数字(最多500个),因此权重会变得很小,并且可能这可能是一个问题该解决方案(拒绝采样)。虽然我仍在尝试,但是我想知道是否还有其他解决方案。

数学不是我的事,所以我感谢任何投入。谢谢。

罗伯特·梅塞尔(Robert Messerle)

我写了一个简短的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));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章