我该如何选择一个不在此数组中的随机值(0到30)?
var list = new Array(1,3,4,7,8,9);
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);
然后:
var rand = list2[Math.floor(Math.random() * list2.length)];
function RandomValueNotInArray(array)
{
var e;
do
{
e = Math.random() * 31; // n + 1
} while (array.contains(e))
return e;
}
Math.random()
返回一个十进制值。在将其与整数列表进行比较之前,您需要使用 Math.trunc()
或 Math.floor()
对返回值进行处理,否则它永远不会匹配。 - OOPS Studiowhile
循环来测试rand
是否在restricted
数组中,如果是,则重新生成一个新的随机数:var rand;
do {
rand = Math.floor(Math.random() * 31); // re-randomize, 0 to 30 inclusive
} while ($.inArray(rand, restricted) > -1);
return rand;
http://jsfiddle.net/mblase75/dAN8R/
不想使用jQuery吗?如果您使用旧浏览器的此polyfill,则可以将$.inArray(rand,restricted)
替换为restricted.indexOf(rand)
。array.contains()
是一个内置方法或者Math.random() * 31
不是浮点数的话,那可能会是这样。 - BlazemongergetNum() {
let randomNum = Math.floor(Math.random() * (30 - 1)) + 1
if (list.includes(randomNum)) {
return getNum()
}
return randomNum
}
这可能会更快,因为它首先尝试返回一个随机数,然后检查它是否在数组中。
参数(生成数量/数组大小): (1000个中的1个)递归~ 0.015毫秒/互补:~ 1.25、1.26毫秒 (10000个中的1个)递归~ 0.030毫秒/互补~ 115毫秒 (100000个中的1个)递归~ 0.44毫秒/互补~ 11573毫秒(或崩溃) (1000个中的1000个)递归~ 4毫秒/互补~ 1182毫秒 (10000个中的10000个)递归~ 317毫秒/互补~ 崩溃 (1000000个中的1000000个)递归~ 31422毫秒/互补~ 没门
请注意,递归有时会使其运行时间加倍(当它调用自身时)! - Marianissimus你可以使用过滤器。
var filteredArray = list.filter(function(e){
return e!= Math.floor(Math.random() * (31));
});
我可能会从中创建一个数组或链表,然后减去不需要的项目。这样,我可以继续删除项目,并且只需随机选择从位置0到数组长度-1的项目,而无需选择相同的内容两次。
另一种方法是在0到30之间随机生成一个数字,并在数组中找到它时继续执行。唯一的问题是知道何时数组已满(以消除无限循环),并且它需要更多的处理器资源。
2行PHP代码:
$result = array_diff(range(1,30), array(1,3,4,7,8,9));
echo $result[array_rand($result)];