生成随机数而不重复异常AS3

时间:2014-12-18 15:13:15

标签: arrays actionscript-3 for-loop random movieclip

我已经看到了其他语言的这个问题,但AS3却没有...而且我很难理解它... 我需要随机生成3个数字,从0到2,但它们不能重复(如000,001,222,212等),它们的顺序不正确(0,1,2)...

我正在使用

for (var u: int = 0; u < 3; u++)
{
    mcCor = new CorDaCarta();
    mcCor.x = larguraTrio + (mcCor.width + 5) * (u % 3);
    mcCor.y = alturaTrio + (mcCor.height + 5) * (Math.floor(u / 3));

    mcCor.gotoAndStop((Math.random() * (2 - u + 1) + u) | 0);           // random w/ repeats
    //mcCor.gotoAndStop(Math.floor(Math.random() * (2 - u + 1) + u));   // random w/ repeats
    //mcCor.gotoAndStop((Math.random() * 3) | 0);                       // crap....
    //mcCor.gotoAndStop(Math.round(Math.random()*u));                   // 1,1,1
    //mcCor.gotoAndStop(u + 1);                                         // 1,2,3

    mcCor.buttonMode = true;
    mcCor.addEventListener(MouseEvent.CLICK, cliquetrio);
    mcExplic.addChild(mcCor);
    trio.push(mcCor);
}

这些是我一直在尝试的代码....到目前为止最好的代码是活动代码(没有//),但它仍然给我重复(如1,1,1)并且还有一个小的有机会来0,1,2 ......

顺便说一句,我想要的是mcCor到第1,2或3帧的gotoAndStop而不重复,所以用户可以按顺序排列(1,2,3或(u = 0,1) ,2),这就是为什么我有时会添加+ 1)

任何想法? =)

3 个答案:

答案 0 :(得分:2)

我发现确保随机唯一数字的一种方法是将可能的数字存储在数组中,然后使用“随机”排序对它们进行排序:

// store the numbers 0, 1, 2 in an array
var sortedNumbers:Array = [];
for(var i:int = 0; i < 3; i++)
{
    sortedNumbers.push(i);
}

var unsortedNumbers:Array = sortedNumbers.slice(); // make a copy of the sorted numbers

trace(sortedNumbers); // 0,1,2
trace(unsortedNumbers); // 0,1,2

// randomly sort array until it no longer matches the sorted array
while(sortedNumbers.join() == unsortedNumbers.join())
{
    unsortedNumbers.sort(function (a:int, b:int):int { return Math.random() > .5 ? -1 : 1; });
}

trace(unsortedNumbers); // [1,0,2], [2,1,0], [0,1,2], etc

for (var u: int = 0; u < 3; u++)
{
    mcCor = new CorDaCarta();
    mcCor.x = larguraTrio + (mcCor.width + 5) * (u % 3);
    mcCor.y = alturaTrio + (mcCor.height + 5) * (Math.floor(u / 3));

   // grab the corresponding value from the unsorted array
   mcCor.gotoAndStop(unsortedNumbers[u] + 1); 

    mcCor.buttonMode = true;
    mcCor.addEventListener(MouseEvent.CLICK, cliquetrio);
    mcExplic.addChild(mcCor);
    trio.push(mcCor);
}   

答案 1 :(得分:1)

马塞拉是对的。使用Array的方法被广泛用于此类任务。当然,您需要检查0,1,2序列,这将是丑陋的,但在通用代码中获取整数的随机序列可能如下所示:

function getRandomSequence(min:int, max:int):Array
{
    if (min > max) throw new Error("Max value should be greater than Min value!");
    if (min == max) return [min];
    var values:Array = [];
    for (var i:int = min; i <= max; i++) values.push(i);
    var result:Array = [];
    while (values.length > 0) result = result.concat(values.splice(Math.floor(Math.random() * values.length), 1));
    return result;
}

for (var i:uint = 0; i < 10; i++)
{
    trace(getRandomSequence(1, 10));
}

你会得到类似的东西:

2,9,3,8,10,6,5,1,4,7
6,1,2,4,8,9,5,10,7,3
3,9,10,6,8,2,5,4,1,7
7,6,1,4,3,8,9,2,10,5
4,6,7,1,3,2,9,10,8,5
3,10,5,9,1,7,2,4,8,6
1,7,9,6,10,3,4,5,2,8
4,10,8,9,3,2,6,1,7,5
1,7,8,9,10,6,4,3,2,5
7,5,4,2,8,6,10,3,9,1

答案 2 :(得分:0)

我为你创造了这个。它工作正常但可以优化......

希望对你有好处。

    var arr : Array = [];
    var r   : int;

    for (var i: int = 0; i < 3; i++){
        r=rand(0,2);
        if(i == 1){
            if(arr[0] == r){
                i--;
                continue;
            }
            if(arr[0] == 0){
                if(r==1){
                    i--;
                    continue;
                }
            }
        }else if(i==2){
            if(arr[0] == r || arr[1] == r){
                i--;
                continue;
            }
        }
        arr[i] = r;
    }

    trace(arr);

    for(var i=0;i<3;i++){
        mcCor = new CorDaCarta();
        mcCor.x = larguraTrio + (mcCor.width + 5) * (i % 3);
        mcCor.y = alturaTrio + (mcCor.height + 5) * (Math.floor(i / 3));
        mcCor.gotoAndStop(arr[i]);  
        mcCor.buttonMode = true;
        mcCor.addEventListener(MouseEvent.CLICK, cliquetrio);
        mcExplic.addChild(mcCor);
        trio.push(mcCor);
    }


    function rand(min:int, max:int):int {
        return Math.round(Math.random() * (max - min) + min);
    }

试试这个......