如何获得没有重复的随机生成的数字

时间:2015-09-21 17:43:11

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

嘿大家我看过一些有关此问题的论坛,但似乎无法解决这个问题。

所以我有一个名为aClockArray的数组,这是一个自定义数组,里面有4个Movie剪辑。嵌套的Movie剪辑为每个帧都有不同的颜色。我在构造函数中设置了这样的数组:

aClockArray = [playScreen.wire_5, playScreen.wire_6, playScreen.wire_7, playScreen.wire_8];

然后在另一个函数中我有一个for循环设置迭代遍历数组中的所有对象,并将它们gotoAndStop放在它们的嵌套电影剪辑中的随机帧上,它从2-7开始随机化,如下所示:

private function randomColorGenerator():void 
    {
        //Loop through wires and make them randomn generate color
        for (var i:int = 0; i < aClockArray.length; i++)
        {
           var currentWires = aClockArray[i];

           nWire = randomNumber(2, 7);

           currentWires.gotoAndStop(nWire);


        }
    }

现在这种方法非常完美,每次重新启动时都会得到随机颜色。但我想要完成的是颜色不重复,所以不要重复nWire = randomNumber(2, 7); 2-7个数字。如何让这些数字随机生成而不重复?

此处还有我的randomNumber功能:

//Generates a truly "random" number
    function randomNumber(low:Number=0, high:Number=1):Number
    {
      return Math.floor(Math.random() * (1+high-low)) + low;
    }

谢谢你的任何帮助将不胜感激!

尝试过类似的东西,但仍然有重复:(

//Loop through wires and make them randomn generate color
        for (var i:int = 0; i < aClockArray.length; i++)
        {
           var currentWires = aClockArray[i];
           var frames:Array = [2, 3, 4, 5, 6, 7, 8];
           var randomFrame:uint = frames.splice(Math.floor(Math.random() * frames.length), 1);


           currentWires.gotoAndStop(randomFrame);


        }

4 个答案:

答案 0 :(得分:3)

创建一个唯一可能结果的数组:

var frames:Array = [2, 3, 4, 5, 6, 7];

然后使用splice随机索引从该数组中删除:

var randomFrame:uint = frames.splice(Math.floor(Math.random() * frames.length), 1);

答案 1 :(得分:3)

我会建议像:

  1. 创建预定义的值列表
  2. 随机化列表
  3. 在每次迭代期间移动列表的第一个值
  4. 例如:

        import flash.display.MovieClip;
    
        function randomizeSort(obj1:Boolean, obj2:Object):int
        {
            var randNum:int = -1 + Math.floor((Math.random() * 3));
            return randNum;
        }
    
        var framesList:Vector.<int> = Vector.<int>([2, 3, 4, 5, 6, 7])
        framesList.sort(randomizeSort);
        trace(framesList);
    
        var tempColor:int;
        var clipsList:Vector.<MovieClip> = Vector.<MovieClip>([playScreen.wire_5, playScreen.wire_6, playScreen.wire_7, playScreen.wire_8]);
        var clipsCount:int = clipsList.length;
        for (var clipIndex:int = 0; clipIndex < clipsCount; clipIndex++)
        {
            tempColor = framesList.shift();
            trace(tempColor);
        }
    

答案 2 :(得分:1)

这是原型制作的理想候选者:

MovieClip.prototype.gotoRandomFrame = function():void
{
    if(!this.frameReferences)
    {
        this.frameReferences = [];
        for(var i:int = 0; i < this.totalFrames; i++)
        {
            this.frameReferences.push(i + 1);
        }       
    }
    var index:int = this.frameReferences.splice(Math.floor(Math.random() * this.frameReferences.length), 1);
    if(!this.frameReferences.length)
    {
        this.frameReferences = null;        
    }
    this.gotoAndStop(index);
}

对于这个原型,您现在可以在任何mocieclip上调用此方法,并让它们显示其时间轴的唯一框架,直到它们全部显示并重新开始。

mymovie.gotoRandomFrame();

其他答案是正确的,但它们不考虑多个动画片段情况。像动画片段那样创建尽可能多的代码和数组是件坏事。

答案 3 :(得分:-3)

我不打算给你确切的代码,因为我不写动作脚本。但是,您只需要保存您使用的最后一种颜色并避免它:

{next_color = randomNumber(2,7)} until next_color != last_color;
currentWires.gotoAndStop(next_color);
last_color = next_color;

中提琴!伪随机颜色。