Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Генератор случайных чисел с вероятностью "не повторения" (http://www.flasher.ru/forum/showthread.php?t=175595)

alex001 20.02.2012 23:16

Генератор случайных чисел с вероятностью "не повторения"
 
Вечер добрый,
Необходим генератор случайнх чисел с вероятностью "неповторения". обьясню кратко: есть один клип, новая копия которого, каждые 50 кадров появляются случайно, либо слево от экрана и перемещается через весь экран направо, либо справо и перемещается налево. их y(высота) тоже случайно считается. высота moveclipа около 50 пикселов. при появлении они должны с большой вероятностью (но не точно) появляться в другом месте и не наезжать на предыдущих. но и слево внизу появился, потом справо наверху, потом опять противоположное, слево внизу не должно быть. ну вы поняли, случайно, с небольшой вероятностью к этому :D
вот что получилось без вероятности:
Код AS3:

var timeToNew:Number = 50;
var didAtDir:int = 0;
this.addEventListener(Event.ENTER_FRAME,ClipCreation);
function ClipCreation(e:Event):void
{
        if (timeToNew <= GameTimer.currentCount) //GameTimer - таймер считающий кадры
        {
                var mc:MovieClip = new MC();
                var dodir:int = Math.random() * 5; //попытка чего-то подобного для стороны появления
                if (didAtDir == 0)
                {
                        if (dodir==1||dodir==2||dodir==3)
                        {
                                mc.x = -300;
                                var dir = 1;
                        }
                        else
                        {
                                mc.x = 1300;
                                var dir = 0;
                        }
                }
                if (didAtDir == 1) // x всегда зависит от стороны
                {
                        if (dodir==1||dodir==2)
                        {
                                mc.x = -300;
                                var dir = 1;
                        }
                        else
                        {
                                mc.x = 1300;
                                var dir = 0;
                        }
                }
                mc.goDir = dir;
                addChild(mc);
                timeToNew +=  50;
                var didAtSide:int = dir;
        }

само перемещение реализовано внутри клипа.

и к слову, таймер реализован вот так. хороший ли это способ, или всетаки для подсчета кадров есть какой-то изобретенный "велосипед", а не просто увеличивающаяся переменная?
Код AS3:

var timeToNew:Number = 50;
this.addEventListener(Event.ENTER_FRAME,GameTimer);
function GameTimer(e:Event):void
{
GameTimer ++;
}


MikroAcse 20.02.2012 23:31

Записываете с помощью for(...) в массив числа, а потом размешиваете с помощью функции в моей библиотеке:
Код AS3:

yourArray = MArrayUtils.sortArrayByRandom(yourArray)

Теперь у тебя есть массив с перемешанными числами.
Бери по одному числу (yourArray[0]), а потом его удаляй (yourArray.splice(0,1)).

КорДум 20.02.2012 23:53

Цитата:

а потом его удаляй (yourArray.splice(0,1)
Есть Array#shift() для этого.

alex001 21.02.2012 00:47

Цитата:

Сообщение от MikroAcse (Сообщение 1064281)
Записываете с помощью for(...) в массив числа, а потом размешиваете с помощью функции в моей библиотеке:
Код AS3:

yourArray = MArrayUtils.sortArrayByRandom(yourArray)

Теперь у тебя есть массив с перемешанными числами.
Бери по одному числу (yourArray[0]), а потом его удаляй (yourArray.splice(0,1)).

посмотрел эту библиотеку, но не понял как это будет работать. я с помощью этой библиотеки получаю массив с перемешанными данными от 0 до 800 (шкала y, число на которой и надо найти), а потом по одному удаляю. а как проблема решается? можно поподробнее?

Wolsh 21.02.2012 01:53

Вы взяли число из массива по индексу [0] (рандомное, массив же перемешан) и удалили его из этого массива. Это гарантирует, что это число уже "не попадется", следующее по тому же индексу [0] будет гарантированно другим. Когда массив закончится, создаете новый. На "стыках" между старым и новым есть ненулевая вероятность совпадения последнего числа из первого массива и первого числа из нового массива. Решается простой проверкой и выкидыванием числа из нового массива, если совпадение есть.

TanaTiX 21.02.2012 02:25

Код AS3:

var timeToNew:Number = 50;
this.addEventListener(Event.ENTER_FRAME,GameTimer);
function GameTimer(e:Event):void
{
GameTimer ++;
}

А этот код ошибку не вызывает?
Мне сложно себе представить инкремент обработчика события таймера.

alex001 21.02.2012 14:37

нет, вы меня просто не поняли :)
например мувклип появился наверху экрана. его y = 100. теперь он должен появиться еще раз, с большой вероятностью что он появится внизу с y = 700. если он появился посередине с y = 400, то вероятнсть что н появиться с обоих других концов равна, а то, что посередине мала. если он появился на высоте 1/4 высоты экрана, то соответственно программа вычисляет вероятность дальше. и разумеется числа не круглые, а случайные.

а таймер работет отлично, просто такой способ меня почему-то смущает.


Часовой пояс GMT +4, время: 17:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.