2015-09-21 4 views
1

Привет всем, я видел некоторые форумы об этом, но, похоже, пока не понял его.Как получить случайные сгенерированные числа без повторения

Итак, у меня есть массив, называемый aClockArray, и это настраиваемый массив, в котором есть 4 видеоклипа внутри. Вложенные видеоклипы имеют разные цвета для каждого кадра. Я массив создан, как это в моем конструкторе:

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

Тогда в другой функции У меня есть для цикла настройки для перебора всех объектов в массиве и иметь их 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); 


     } 
    } 

Теперь это работает идеально, и я получаю случайные цветы каждый раз, когда я перезагрузки. Но то, что я хотел бы сделать, - это не повторять цвета, чтобы не повторять повторные цифры чисел 0-. Как бы я сделал это, чтобы эти числа случайным образом генерировались, а не повторялись?

Также Вот моя 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); 


     } 

ответ

3

Создать массив уникальных возможных результатов:

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

Затем удалить из этого массива в случайном индексе с splice:

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

Благодарим вас за это. Я знаю, как это происходит, когда я попробую это позже сегодня! – Nathan

+1

Это может быть * слегка * быстрее рандомизировать массив, а затем использовать 'pop()' или 'shift()' (что делает @Flashist * пытается * выполнить), но это также хорошее решение и самый компактный , Если вы не используете код для каждого кадра, не должно быть никаких различий в производительности. – BadFeelingAboutThis

+0

Все еще запутался, как я это реализую. Смогу ли я использовать мой ток для Loop? Добавляя к нему что-то подобное и сращивая его оттуда? – Nathan

-3

Я не собираюсь давать вам точный код, так как я не пишу в ctionscript. Но вам просто нужно сохранить последний использованный цвет и избежать его:

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

Viola! Псевдо-случайные цвета.

+0

Интересно Спасибо за совет, я обязательно попробую его сегодня! – Nathan

+0

Будет ли это гарантировать, что первое и третье число отличаются? – null

+0

это неправильное решение. – BotMaster

3

Я хотел бы предложить что-то вроде:

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

@BadFeelingAboutЭто не конструктор, а [функция верхнего уровня Vector. ] (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/package.html#Vector%28%29) Еще одна сокращенная нотация «Вектор» ['new [1, 2, 3 ] '] (http://help.adobe.com/en_US/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee5.html#WSB1F41227-C612-4f33-A00E-CE84C1913E1C) – null

+0

@null - я исправлен. Думаю, мне нужно чаще использовать стенографию. Не то чтобы я даже делал проект AS3 в лучшую часть года. – BadFeelingAboutThis

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

Thx для этого прототипа теперь вы можете вызвать этот метод на любой mocieclip и иметь их отображения уникального кадра их сроков, пока они не отображаются их всех, и они начинают снова.

mymovie.gotoRandomFrame(); 

Другие ответы верны, но они не учитывают ситуацию с несколькими мувиклипами. Было бы неплохо создать столько кусков кода и массивов, сколько у вас есть мувиклипы.

+1

Если вы редактируете прототип, вы создаете один массив для каждого экземпляра (независимо от того, нужна ли вам функциональность или нет). Гораздо лучше создать определение класса и либо распространить его на некоторый другой класс, либо просто установить его как класс для символа MovieClip. –

+0

@AmyBlankenship. Мне тоже не нравится использовать прототип, но, если быть справедливым, массив 'frameReferences' только присоединяется, если вы вызываете метод gotoRandomFrame(). – Aaron

+0

Все еще немного запутывает, как это реализовать. Все равно идти на это не повезло. Метод Tried Nulls, но не удача – Nathan

Смежные вопросы