我有一个包含 20 个值的数组(比如“origA”)和另一个数组(比如“itemA”,其中只有 1 个值。我需要将“origA”的任何 10 个随机值推入“itemA”。但我不能推送已经推送到“itemA”中的相同值。
我们应该怎么做?
我有一个包含 20 个值的数组(比如“origA”)和另一个数组(比如“itemA”,其中只有 1 个值。我需要将“origA”的任何 10 个随机值推入“itemA”。但我不能推送已经推送到“itemA”中的相同值。
我们应该怎么做?
您可以创建一个副本origA
并从中删除您添加的项目itemA
:
非优化版本:
var origA:Array = [1, 2, 3, 4, 5, 6, 7];
var itemA:Array = [0];
var copyA:Array = origA.concat();
var N:int = 10;
var n:int = Math.min(N, copyA.length);
for (var i:int = 0; i < n; i++) {
// Get random value
var index:int = Math.floor(Math.random() * copyA.length);
var value:int = copyA[index];
// Remove the selected value from copyA
copyA.splice(index, 1);
// Add the selected value to itemA
itemA.push(value);
}
trace(itemA);
//0,1,7,2,6,4,3,5
优化版本(不调用length
, indexOf
,splice
或push
循环内):
var origA:Array = [1, 2, 3, 4, 5, 6, 7];
var itemA:Array = [0];
var copyA:Array = origA.concat();
var copyALength:int = copyA.length;
var itemALength:int = itemA.length;
var N:int = 10;
var n:int = Math.min(N, copyALength);
for (var i:int = 0; i < n; i++) {
// Get random value
var index:int = Math.floor(Math.random() * copyALength);
var value:int = copyA[index];
// Remove the selected value from copyA
copyA[index] = copyA[--copyALength];
// Add the selected value to itemA
itemA[itemALength++] = value;
}
trace(itemA);
//0,2,5,7,4,1,3,6
Edit1:如果您的原始数组只有几个项目,请使用我的第一个版本或其他答案中的任何其他解决方案。但如果它可能有数千个或更多项目,那么我建议你使用我的优化版本。
编辑:21,000
这是从包含项目的数组中复制随机选择的项目所花费的时间1,000,000
:
2000ms
12ms
1ms
// Define how many random numbers are required.
const REQUIRED:int = 10;
// Loop until either the original array runs out of numbers,
// or the destination array reaches the required length.
while(origA.length > 0 && itemA.length < REQUIRED)
{
// Decide on a random index and pull the value from there.
var i:int = Math.random() * origA.length;
var r:Number = origA[i];
// Add the value to the destination array if it does not exist yet.
if(itemA.indexOf(r) == -1)
{
itemA.push(r);
}
// Remove the value we looked at this iteration.
origA.splice(i, 1);
}
这是一个真正的短篇。从原始数组中删除随机项,直到达到 MAX,然后连接到目标数组:
const MAX:int = 10;
var orig:Array = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
var target:Array = [];
var tmp:Array = [];
var i : int = -1;
var len : int = orig.length;
while (++i < MAX && len > 0) {
var index:int = int( Math.random()*len );
tmp[i] = orig[index];
orig[index] = orig[--len];
}
target = target.concat(tmp);
编辑
采用@sch 的移除项目的方式。应该接受的是他的回答。我只是将这个保留在 while 循环中。