Javascript 选择不在数组中的随机值

Javascript 选择不在数组中的随机值,javascript,jquery,Javascript,Jquery,如何选择不在此数组中的随机值(0到30) var list = new Array(1,3,4,7,8,9); 构建互补数组并从中选取随机值 var list2 = new Array(); for(var i=0; i<30; i++) if(!list.contains(i)) list2.push(i); 我可能会制作一个数组或链表,从中减去不需要的项。这样我就可以继续删除项目,只需随机选择从位置0到数组长度-1的项目,而不必选择相同的项目两次 另一种方法是将0到30

如何选择不在此数组中的随机值(0到30)

var list = new Array(1,3,4,7,8,9);

构建互补数组并从中选取随机值

var list2 = new Array();
for(var i=0; i<30; i++)
  if(!list.contains(i))
    list2.push(i);

我可能会制作一个数组或链表,从中减去不需要的项。这样我就可以继续删除项目,只需随机选择从位置0到数组长度-1的项目,而不必选择相同的项目两次

另一种方法是将0到30之间的数字随机化,并在数组中找到它时继续这样做。唯一的问题是知道阵列何时满了(以消除无限循环),以及它的处理器密集度要高得多。

您可以使用


假设您的列表大小合理,创建一个不在数组中的数字列表,然后从该数组中随机选择一个数字。

PHP分两行:

function RandomValueNotInArray(array)
{
    var e;
    do
    {
        e = Math.random() * 31; // n + 1
    } while (array.contains(e))
    return e;
}
$result = array_diff(range(1,30), array(1,3,4,7,8,9)); 
echo $result[array_rand($result)];

您需要一个
while
循环来测试
rand
是否在
restricted
数组中,如果是,则重新生成一个新的随机数:

var rand;
do {
    rand = Math.floor(Math.random() * 31); // re-randomize, 0 to 30 inclusive
} while ($.inArray(rand, restricted) > -1);
return rand;


不想要jQuery?如果使用,您可以将.inArray(rand,restricted)替换为。

一个小递归函数:

getNum() {
  let randomNum = Math.floor(Math.random() * (30 - 1)) + 1
  if (list.includes(randomNum)) {
    return getNum()
  }
   return randomNum
}

可能会稍快一点,因为它首先试图返回一个随机数,然后检查它是否在数组中。< /p>但是Math.Road将生成浮点,它应该是Max.Read()* 31。代码本身就说明了,但是为了完整性考虑,添加一个描述性的问题是稍微开放的,我道歉。我正在寻找不同的选项,线索。你的代码将创建一个列表,其中包含数组中存在的一些数字。OP想要的是完全相反的东西,只是数组中没有一个数字。如果这个问题以前被标记为PHP,那么现在就不是了。只是想帮助从Google来到这里的人。这不是和两年前发布的答案一样吗?@TJ如果
array.contains()
是一个内置方法或者
Math.random()*31
不是浮点数。随着排除数组中元素数量的增加,性能如何?当可能的范围从30增长到30000,然后再增长到30000000时,此策略如何执行?感谢您的询问,运行了一些测试。使用递增随机数数组,并将递归与@slaphappy的互补arr(多数投票解决方案)进行比较<代码>参数(生成的数量/数组中的数量):(1/1000)递归~0.015毫秒/互补:~1.25,1.26毫秒(1/10000)Rec~0.030ms/Com~115ms(1/100.000)Rec~0.44ms/Com~11573ms(或崩溃)(1000/1000)Rec~4毫秒/Com~1182毫秒(10.000/10.000)Rec~317ms/Com~crash(1000.000/1000)Rec~31422ms/Com~没门请注意,递归有时会将其运行时间加倍(当它调用自身时)!
var rand;
do {
    rand = Math.floor(Math.random() * 31); // re-randomize, 0 to 30 inclusive
} while ($.inArray(rand, restricted) > -1);
return rand;
getNum() {
  let randomNum = Math.floor(Math.random() * (30 - 1)) + 1
  if (list.includes(randomNum)) {
    return getNum()
  }
   return randomNum
}