此功能是否有两种以上可能的结果?

时间:2016-10-03 14:45:23

标签: javascript

我有一个应该用于随机重定向到另一个页面的函数:

function () {
        var rand_exp = ['v', 'a'];
        var pick_exp = function(expType) {
                    return expType[Math.floor(Math.random()*expType.length)];
                 }
        if (pick_exp(rand_exp) === 'v') {
           window.location.replace("experiment_v.html");
        } else if (pick_exp(rand_exp) === 'a') {
           window.location.replace("experiment_a.html");
       }
    }

我已经多次测试了这一点,似乎发生了3件事中的一件,它将重定向到if和else if语句中的两个子句之一,或者它将重定向到上面javascript所嵌入的页面,在这种情况下,我只是有一个空白的屏幕,这是预期的吗?

2 个答案:

答案 0 :(得分:1)

我认为我将上面的评论转化为正确的答案,答案的简短版本是肯定的,有两种以上可能的结果。

更长的版本

您的函数pick_exp已正确实现,因此它将选择输入数组的元素。问题是你不止一次地调用它并且期望数组的元素在结果中均匀地表示。

在第一种情况下,您第一次致电pick_exp。结果可能是'a'或'v',这将导致表达式为真或假,每种情况的概率为50%。如果它是假的,那么你再次调用它,然后它选择一个 new 值,它可能是'a'或'v',具有相同的概率无关或者结果是你上次调用它的结果,因此有50%的可能性,第二个表达式也会导致错误,这意味着您从函数返回时没有发生重定向。实际重定向的可能性总体上应该在50%左右。

固定代码如下所示:

function () {
    var rand_exp = ['v', 'a'];
    var pick_exp = function (expType) {
        expType[Math.floor(Math.random()*expType.length)];
    };

    var result = pick_exp(rand_exp);

    if (result === 'v') {
       window.location.replace("experiment_v.html");
    } else if (result === 'a') {
       window.location.replace("experiment_a.html");
   }
}

你可以在没有这个功能的情况下做到这一点:

function () {
    var rand_exp = ['v', 'a'];
    var pick_exp = rand_exp[Math.floor(Math.random()*rand_exp.length)];

    if (pick_exp === 'v') {
       window.location.replace("experiment_v.html");
    } else if (pick_exp === 'a') {
       window.location.replace("experiment_a.html");
   }
}

上述代码会产生两种可能的路径:'v' -> experiment_v.htmla -> experiment_a.html

或者,您可以直接使用结果:

function () {
    var rand_exp = ['v', 'a'];

    window.location.replace("experiment_" + rand_exp[Math.floor(Math.random()*rand_exp.length)] + ".html");
}

答案 1 :(得分:0)

  

此功能有两种以上可能的结果吗?

不,您的通用套装仅限于['v', 'a']

这一行

return expType[Math.floor(Math.random()*expType.length)];

只会返回' v'或者' a',因为expType.length 2

Math.random返回0到1(小于1)之间的分数值。

当您将该值乘以2(expType.length)时,输出将始终小于2,如果执行Math.floor,则输出将为0或1。