这个算法如何选择随机对象密钥? (Math.random()< 1 / ++ c)

时间:2017-09-14 13:07:43

标签: javascript

function randomKey(obj) {
    var ret;
    var c = 0;
    for (var key in obj)
        if (Math.random() < 1/++c)
           ret = key;
    return ret;
}

有人可以解释这段代码如何从对象中选择一个随机密钥吗?

1 个答案:

答案 0 :(得分:5)

假设obj中有三个键。在循环的第一次迭代中,1/++c将为1,因此ret将始终设置为第一个键。在第二次迭代中,1/++c将等于0.5,因此生成的随机数将小于该概率的概率为1/2,因此将ret更改为第二次的概率为50%键。在第三次迭代1/++c将是0.333 ...,因此ret将变为第三个键的概率为1/3。

对于obj中的任何尺寸集合,您最终应该均匀分配密钥。