1

我正在写一个“谁想成为百万富翁”的克隆,偶然发现了一个我无法理解的小问题。

我有一个小丑,显示每个答案的百分比,显示答案正确的可能性。为此,我将 15% 分配给每个错误答案,将剩余的 55% 分配给正确答案。

然后我使用一个循环,在这些答案中循环 (level * 10) 次,并将其中一个答案(随机选择)的 1% 分配给其他答案之一(也随机选择)。

其背后的想法是,较低的级别仍然会以较高的百分比显示真正的答案,但较高的级别将很有可能以最多的百分比显示错误答案或答案之间的总体相等.

唉,它并没有想象中那么好,即使在高水平(高达 12),真正的答案仍然非常明显可见,我不知道我可以使用什么样的算法来让它变得更好?!

4

2 回答 2

1

好吧,您可以尝试使用指数失真而不是线性失真。

在此处查看 JavaScript 中的实现:http: //jsfiddle.net/hua7R/1/

首先我们设置级别数和指数失真:

var levels=12,
    distortion=5;

以下函数并不重要,我只是为了让日志按列分布而使用它。

function numToStr(n){
    var s=String(n);
    for(var i=s.length;i<3;i++){
        s=' '+s;
    }
    return s;
}

我们遍历所有级别以查看它们之间的差异:

for(var l=0;l<=levels;l++){

    //In this test the right solution is always the last:

    var percentages=[15,15,15,55];

    /*The following function gives us a random number from 0 (included)
      to `percentage`'s lenght (not included).
      If it's called with the argument `true`, it checks if we can
      subtract 1 to that percentage (we don't want negative percentages).*/

    function random(cond){
        var i=Math.floor(Math.random()*percentages.length);
        if(!cond||percentages[i]>0){
            return i;
        }
        return random(true);
    }

    /*Then we iterate from 0 to the maximum value between `l*10`
      (`l` is the current level) and `l` raised to the power of `distortion`*/

    for(var i=0;i<Math.max(l*10,Math.pow(l,distortion));i++){
        percentages[random(true)]--;
        percentages[random()]++;
    }

    //Finally, the log:

    document.getElementById('log').innerHTML+="level "+numToStr(l)+" -> ["+numToStr(percentages[0])+", "+numToStr(percentages[1])+", "+numToStr(percentages[2])+", "+numToStr(percentages[3])+"]\n";
}
于 2012-08-14T17:30:02.480 回答
1

在没有对概率分布进行分析的情况下,我认为一个可能对您有用的简单易懂的算法如下所示:

select 100 rand numbers from 1 to n (I will get to how you set n)
calculate how many 1's,2's,3's and numbers >= 4 you get
Use these counts as your answer scores, with the counts for >=4 being for the correct answer

因此,例如,如果您从 n 到 4,您将在所有答案中平均获得 25% 的分数。如果将 n 设置为 5,则正确答案的平均得分为 40%。通过改变 n、您绘制的兰特数量以及如何将数字映射到答案(例如,您可以将 1 和 2 分配给第二好的答案等),您可以非常精确地改变均值和方差。

如果您对概率分布有更多了解,这些绝对是直接执行此操作的更好方法。这种方法只是因为它的算法简单。

于 2012-08-14T19:02:42.173 回答