【问题标题】:How to get random generated Numbers with no Repeat如何获得不重复的随机生成的数字
【发布时间】:2015-12-18 12:30:59
【问题描述】:

大家好,我看过一些关于这个的论坛,但似乎仍然无法弄清楚。

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

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


        }

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢你,今天晚些时候我会告诉你它是怎么回事!
    • 先随机化数组可能会稍微快一点,然后使用pop()shift()(@Flashist 正在尝试完成),但这也是一个很好的解决方案,也是最紧凑的。除非您每帧都运行代码,否则不应该有任何性能差异。
    • 仍然对如何实现这一点感到困惑。我还会使用当前的 for Loop 吗?添加这样的东西并从那里拼接?
    • 我尝试了类似 currentWires.gotoAndStop(randomFrame);但它只产生了所有相同的颜色
    • 如果您可以看一下,请用我尝试过的方法更新我的答案,谢谢它在问题的底部
    【解决方案2】:

    我建议如下:

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

    例如:

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

    【讨论】:

    • @BadFeelingAboutThis 不是构造函数,而是top level function Vector.<T> 另一个简写Vector 表示法是new &lt;int&gt;[1, 2, 3]
    • @null - 我的立场是正确的。我想我需要更频繁地使用速记。并不是说我在一年的大部分时间里都做过一个 AS3 项目。
    【解决方案3】:

    这是原型设计的理想候选者:

    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();
    

    其他答案是正确的,但它们没有考虑到多个影片剪辑的情况。必须创建与您拥有的影片剪辑一样多的代码和数组,这将是很糟糕的。

    【讨论】:

    • 如果您编辑原型,您将为每个实例创建一个数组(无论您是否需要该功能)。最好创建一个 Class 定义并将其扩展为其他 Class 或将其设置为 MovieClip 符号的 Class。
    • @AmyBlankenship 我也不喜欢使用原型,但公平地说,frameReferences 数组只有在您调用 gotoRandomFrame() 方法时才会被附加。
    • 对于如何实现这一点仍然有点困惑。仍然没有运气。尝试了 Nulls 方法,但没有运气
    • 不能不同意更多艾米,首先你不正确,不需要该功能的电影不会创建任何额外的数组。其次,它是原型而不是 Class 的理想候选者,因为它消除了为每部需要它的电影专门实现它的需要,从而节省了时间。 Nathan 只需将该代码放在您项目中的任何位置(一开始就更好),任何电影都可以调用该方法。
    • 别误会,伙计们,我并不是在提倡使用我自己很少使用的原型,但在某些情况下,这个技巧是正确的,可以节省很多时间,我认为这里就是这种情况。
    【解决方案4】:

    我不会给你确切的代码,因为我不写在 actionscript 中。但是,您只需要保存最后使用的颜色并避免它:

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

    维奥拉!伪随机颜色。

    【讨论】:

    • 有趣谢谢您的建议,我今天一定会尝试一下!
    • 那能保证第一个和第三个数字不一样吗?
    • 提问者只要求不重复的伪随机数。 (即不要连续两次播放相同的视频)他没有指定结果不应该与之前的任何条目匹配。如果您对这个问题有更多了解,那不是我的错。
    猜你喜欢
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多