将随机值从一个数组传递到另一个数组而不重复

时间:2012-04-16 06:52:53

标签: actionscript-3

我有一个数组(比如'origA'),其中包含20个值和另一个数组(比如说“itemA”,其中只有1个值。我需要按任意10个随机值的“ origA“into”itemA“。但我无法推送已经推入”itemA“的相同值。

我们怎么做?

3 个答案:

答案 0 :(得分:3)

您可以创建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

优化版本(在循环中没有调用lengthindexOfsplicepush

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

编辑1:如果您的原始数组只有几个项目,请在其他答案中使用我的第一个版本或任何其他解决方案。但如果它可能有数千件或更多,那么我建议你使用我的优化版本。


编辑:2 以下是从包含1,000个项目的数组中复制1,000,000个随机选择的项目所需的时间:

  • 所有其他版本:2000ms
  • 优化版本:12ms
  • 未克隆原始数组的优化版本:1ms

答案 1 :(得分:2)

// 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);
}

答案 2 :(得分:2)

这是一个真正的短篇小说。从原始数组中删除随机项,直到达到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循环。