JavaScript - 如何在不更换的情况下随机抽样项目?

seR*_*OOO 4 javascript random probability random-sample

JavaScript的

我试过寻找这样的东西,但我找不到它.

这是一个简单的想法:

一个.取0到10之间的随机数.

湾 假设滚动的随机数是3.

C.然后,保存号码(3).

d.现在,在0到10之间再次取一个随机数,但它不能是3,因为它已经出现了.

Str*_*lle 16

一种解决方案是生成一个数组("桶"),其中包含您要选择的所有值,在本例中为0到10之间的所有数字.然后从数组中随机选取一个并从桶中删除它.请注意,下面的示例不会检查存储桶是否为空,因此如果您将此功能调用超过10次,则会出现错误.

var bucket = [];

for (var i=0;i<=10;i++) {
    bucket.push(i);
}

function getRandomFromBucket() {
   var randomIndex = Math.floor(Math.random()*bucket.length);
   return bucket.splice(randomIndex, 1)[0];
}

// will pick a random number between 0 and 10, and can be called 10 times
console.log(getRandomFromBucket());
Run Code Online (Sandbox Code Playgroud)

  • @skovalyov也许是最优雅的,但不是最优的 - 我最后一次测试时,`splice`的速度大约是用`for`循环手动改组元素的一半.如果您不需要按顺序保持数组,那么最快的方法是将最后一个元素移动到随机位置. (4认同)
  • @ ShawnCicoria-MSFT我并不是在抱怨优雅,但是您使用性能分析来确定最佳解决方案,而不是简单性。 (2认同)