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

Pet*_*ete 12 javascript random numbers

基本上我选择0-24之间的随机数:

Math.floor(Math.random() * myArray.length); // myArray contains 25 items
Run Code Online (Sandbox Code Playgroud)

让我们说它出现了8.现在我想得到0-24相同范围内的另一个数字,但这一次,我不想要一个8.下一次,我可能会滚动一个15.现在我想再次滚动但是我不想要8或15.我现在处理这个问题的方法是使用do while循环,如果数字相同,我只是重新滚动.

这是我家庭作业的一小部分,事实上,我已经努力满足所有要求,所以我想你可以说这是为了我个人的利益,所以我可以写得恰到好处,而不是最终的"每日wtf" ".

roc*_*est 18

设置一个包含所有值的数组(如果你只做一些小数字,这只是一个有效的选项,比如你的例子中的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];
Run Code Online (Sandbox Code Playgroud)

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

var num = Math.floor(Math.random() * array.length);
Run Code Online (Sandbox Code Playgroud)

从数组中删除该索引号:

var roll = array.splice(num, 1);
Run Code Online (Sandbox Code Playgroud)

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

从滚动中获取第一个索引,因为我们只切掉了1个:

var yourNumber = roll[ 0 ];
Run Code Online (Sandbox Code Playgroud)

继续做任意数量的卷.此外,您可能希望将原始阵列存储为副本,以便您可以轻松地"重置"数字.


Ale*_*lls 5

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

function getRandomWithOneExclusion(lengthOfArray,indexToExclude){

  var rand = null;  //an integer

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

  return rand;
}
Run Code Online (Sandbox Code Playgroud)

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

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

而已。如果您想排除价值,那么您就必须使其更加复杂,但是要排除一个价值,则效果很好。对此的递归解决方案是过度杀伤和一个坏主意。

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

function getRandomWithManyExclusions(originalArray,arrayOfIndexesToExclude){

   var rand = null;

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

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