如何生成一个范围内的随机数但排除一些?

新手上路,请多包涵

基本上我在 0-24 之间选择一个随机数:

 Math.floor(Math.random() * myArray.length); // myArray contains 25 items

假设结果是 8。现在我想得到相同范围 0-24 中的另一个数字,但这次,我不想要 8。下一次,我可能会掷出 15。现在我想再次掷出但我不想要 8 或 15。我现在处理这个问题的方法是使用 do while 循环,如果数字相同,我就重新滚动。

这是我家庭作业的一小部分,事实上,我正在努力满足所有要求,所以我想你可以说这是为了我个人的利益,这样我就可以正确地写这篇文章,而不是在“每日 wtf”上结束”。

原文由 Pete 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

设置一个包含所有值的数组 (这只是一个有效的选项,如果你只做小数字,比如你的例子中的 25) ,就像这样:

 var array = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24];

然后,在 0 和数组长度之间选择一个随机数:

 var num = Math.floor(Math.random() * array.length);

从数组中 删除 该索引号:

 var roll = array.splice(num, 1);

Javascript splice() 从数组中删除索引项并将项作为数组返回。非常适合您使用。

从 roll 中获取第一个索引,因为无论如何我们只切出 1:

 var yourNumber = roll[ 0 ];

继续做尽可能多的卷。此外,您可能希望将原始数组存储为副本,以便您可以轻松地“重置”数字。

原文由 rockerest 发布,翻译遵循 CC BY-SA 3.0 许可协议

这很容易,伙计们。您不希望对此进行递归。这些答案真的很糟糕。理想情况下,您也不希望对数组进行硬编码。

 function getRandomWithOneExclusion(lengthOfArray,indexToExclude){

  var rand = null;  //an integer

    while(rand === null || rand === indexToExclude){
       rand = Math.round(Math.random() * (lengthOfArray - 1));
    }

  return rand;
}

现在使用从上述函数返回的值从你想要的任何数组中选择一个元素,就像这样:

 var arr = [];
var random = getRandomWithOneExclusion(arr.length,5);  //array has length x, we want to exclude the 5th element
var elem = arr[random];

而已。如果你想排除的不仅仅是价值,那么你必须使它更复杂,但为了排除一个价值,这很有效。对此的递归解决方案是矫枉过正和一个坏主意。

我没有对此进行测试,但要排除多个元素,请尝试以下操作:

 function getRandomWithManyExclusions(originalArray,arrayOfIndexesToExclude){

   var rand = null;

   while(rand === null || arrayOfIndexesToExclude.includes(rand)){
         rand = Math.round(Math.random() * (originalArray.length - 1));
    }
     return rand;
  }

上述方法听起来与 OP 的原始方法没有太大区别。此方法可以正常工作,因为它不会以有偏差的方式从数组中进行采样。

原文由 Alexander Mills 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题