我有一个包含有限数量项目的数组。我想随机删除项目,直到所有项目都被使用过一次。
示例[1,2,3,4,5]
使用随机数5,所以我不想再这样了。 使用随机数2,所以我不想再这样做了。 等等..
我可以使用另一个已使用过的数字列表并检查新的随机数是否在其中,但是当数组中只剩下1或2个数字时,这可能需要很长时间。
有没有办法在javascript中从数组中删除项?它是否会创建一个 new 数组并且效率低下吗?
数组是否是错误的方法?
编辑:这里有一些好的答案。我最终随机化了数组列表,然后拼接了我拿出的第一个项目。
答案 0 :(得分:9)
使用Math.random()
和splice()
的组合:
var arr = [1, 2, 3, 4, 5],
i;
while ( arr.length ) {
i = Math.floor( Math.random() * arr.length );
alert( arr.splice(i, 1) );
}
现场演示: http://jsfiddle.net/simevidas/n2Bmk/
更新:您可以使用此功能从阵列中删除随机项:
function popRandomItem(arr) {
return arr.length ?
arr.splice(Math.floor(Math.random() * arr.length), 1)[0] : null;
}
因此,如果您有一个数组x
,那么popRandomItem(x)
将从该数组中删除一个随机项并返回该项。 (如果x
是一个空数组,则该函数将返回null
。)
答案 1 :(得分:4)
您可以使用splice()
删除数组元素。
下面的函数允许你指定一个上限和下限,并且调用结果返回的函数将返回一个随机数,直到该池为空,在这种情况下它将返回false
(确保你用getRandom() === false
)。
var getRandomNumberOnce = function(lower, upper) {
var pool = [];
for (var i = lower; i <= upper; i++) {
pool.push(i);
}
return function() {
if (pool.length == 0) {
return false;
}
var randomIndex = Math.floor(Math.random() * pool.length ),
randomNumber = pool[randomIndex];
pool.splice(randomIndex, 1);
return randomNumber;
}
}
var myRandom = getRandomNumberOnce(0, 50);
myRandom(); // 4 (guaranteed to be random) :P http://xkcd.com/221/
答案 2 :(得分:2)
我知道你要求删除元素,但我会继续提出另一种方法。这种方式做你想要的相同的事情(只获得一个随机元素)但不涉及删除元素 - 嗯,它没有。
基本上,随机化数组的顺序而不是寻找随机元素。然后按照您需要的随机元素的数组工作。你的第一个随机元素将是0索引,第二个随机元素将是1索引,等等。
var array = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14];
array.sort(function(){ return (Math.round(Math.random())-0.5); });
for(var i=0;i<array.length;i++){
$("#list").append('<li>Random element ' + i + ': ' +array[i]);
}
示例:http://jsfiddle.net/jonathon/Re4HK/
另一个问题是关于randomising a JavaScript array,但我只是使用了基本的随机排序,因为它可以用来说明这个想法。如果你担心 随机数组是什么,你可能想看一下。
答案 3 :(得分:0)
有时你想要一个随机物品而不是 如果偶尔重复一次,请小心。
其他时候你想在aray为空时退出, 并且看不到重复。
Array.prototype.getRandom= function(cut){
var i= Math.floor(Math.random()*this.length);
return cut? this.splice(i, 1): this[i];
}