Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Случайный массив (http://www.flasher.ru/forum/showthread.php?t=87100)

Mr. Fixit 28.10.2006 23:09

Случайный массив
 
Проблема:
Незнаю как решить задачу...
-------------------------------
Как сделать что-бы выбирался случайный массив?
Код:

//vars
var myArr:Array = new Array();
myArr = ["A", "B", "C"];
len = myArr.length;
//on button
next_btn.onRelease = function() {
        ran = int(Math.random()*len);
        _root.attachMovie(myArr[ran], "mc", 0);
        _root.mc._x = Stage.width/2;
        _root.mc._y = Stage.height/2;
};

на сцену выводится, то "A" 2-раза, то "B" n-раз, то "C" n-раз...
----------------------------------------------
Вопрос: как сделать, что бы если запускаешь функцию, то выводилось например "А", но неповтрялось вторично, а сдедовало за ним следущие "С" или "В", тоесть отбор случайности не повторялся до тех пор пока все елементы массива не пройдут...

iNils 28.10.2006 23:20

Я уже устал считать, сколько раз я эту функцию писал. Вы поиском пытались воспользоваться?

Хемуль 28.10.2006 23:22

Не проверял... Может и не работать...
Код:

//vars
var myArr:Array = new Array();
myArr = ["A", "B", "C"];
var myArrLength:Number = myArr.length;
var tempArr:Array = new Array();
resetTempArray();

function resetTempArray()
{
    for (var index:Number = 0; index < myArrLength; index++)
    {
        tempArr.push(myArr[index]);
    }
}

//on button
next_btn.onRelease = function() {
    var len:Number = tempArr.length;
    if (len == 0)
    {
        resetTempArray();
        len = tempArr.length;
    }
    var ran:Number = randRange(0, len - 1);
    _root.attachMovie(tempArr[ran], "mc", 0);
    _root.mc._x = Stage.width/2;
    _root.mc._y = Stage.height/2;
    tempArr.splice(ran, 1);
};

function randRange(min:Number, max:Number):Number {
    var randomNum:Number = Math.round(Math.random()*(max-min))+min;
    return randomNum;
}


D12 29.10.2006 01:10

Код:

Fenix = 0;
var arr = ["a", "b", "c"];
this.onMouseDown = function() {
        ran = random(arr.length);
        _root.attachMovie(arr[ran], "mc", 1);
        _root.mc._x = _xmouse;
        _root.mc._y = _ymouse;
        if (ran == 0) {
                arr.splice(0, 1);
                Fenix += 1;
        }
        if (ran == 1) {
                arr.splice(1, 1);
                Fenix += 1;
        }
        if (ran == 2) {
                arr.splice(2, 1);
                Fenix += 1;
        }
        if (Fenix == 3) {
                Fenix = 0;
                arr.splice(0, 0, "a", "b", "c");
        }
};

держи =)

iNils 29.10.2006 01:13

2 D12: тебе не приходило в голову, что
Код:

if (ran == 0) {
        arr.splice(0, 1);
        Fenix += 1;
}
if (ran == 1) {
        arr.splice(1, 1);
        Fenix += 1;
}
if (ran == 2) {
        arr.splice(2, 1);
        Fenix += 1;
}

можно записать как
Код:

arr.splice(ran, 1);
Fenix ++;


D12 29.10.2006 01:18

Многоуважаемый iNils это ты должен знать , флешь твоя работа и ты в ней совершенствуешся =)
а я так итузиазист : )

P.S. Постораюсь расти над собой : )

Mr. Fixit 29.10.2006 01:22

Сенкс чуваки....

iNils 29.10.2006 01:24

2 D12: Ладно прибедняться :)

Wolsh 29.10.2006 01:57

Мой старый гениальный код :) Не смейтесь, он НИКОГДА не ошибается
Код:

my_btn.onPress = function()  {
        n=(random(5)+ 1);
       
    if (n == m) {n=(random(5)+1)};
        if (n == m) {n=(random(5)+1)};
        if (n == m) {n=(random(5)+1)};
        if (n == m) {n=(random(5)+1)};
        if (n == m) {n=(random(5)+1)};
       
        m=n;
       
        trace(m);
}


Хемуль 29.10.2006 02:16

2 Wolsh:
Да, это действительно не смешно... +_+

Wolsh 29.10.2006 02:25

Не, ну если хочешь можешь засунуть в цикл, но копи/пасте быстрее :)
(я всё понимаю про "красоту кода", потому и просил не смеяться)

etc 29.10.2006 02:32

Код:

a = ['a', 'b', 'c'];
Array.prototype.shuffle = function() {var len = this.length;for (l=0; l<len; l++) {this.splice(random(this.length), 0, this.splice(random(this.length), 1));}};
a.shuffle();
trace(a);


etc 29.10.2006 02:36

А вообще, мне больше всех вот это элегантное решение нравится:
Код:

Array.prototype.shuffle = function() {
        var rand = function() {return Math.floor(Math.random()*3);};
        return this.sort(rand);
}
a = [1,2,3,4,5,6,7,8,9];
a.shuffle();
trace(a);


iNils 29.10.2006 02:57

Денис, как тебе это может нравится, когда это не АС2 и меняет текущий класс?:D

Wolsh 29.10.2006 02:57

Элегантное??? Может быть. Только оно ПОВТОРЯЕТСЯ, а значит не является решением заявленной проблемы. И первое (прости за наглость), тоже повторяется.

Хемуль 29.10.2006 03:03

Ну, вообще, если говорить о задаче, то вот:
Цитата:

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

iNils 29.10.2006 03:05

Цитата:

Сообщение от Wolsh
Элегантное??? Может быть. Только оно ПОВТОРЯЕТСЯ, а значит не является решением заявленной проблемы. И первое (прости за наглость), тоже повторяется.

Где оно повторяется?

Wolsh 29.10.2006 03:06

Думаю, товарищ сформулировал неверно. Понятно же и так, чего он хочет - чтобы два раза подряд один и тот же мувик не пошел

Wolsh 29.10.2006 03:12

Нет, массив-то оно перемешивает будь здоров. Это его задача, и она решена на 5. Но элементы по одному индексу повторяются, и значит невозможно вытащить неповторяющееся число. Это в общем и так видно, из кода. Чтобы решить поставленную задачу, надо либо проверять на равенство с предыдущим значением, либо исключать это значение из рассматриваемых заранее.
Других способов не вижу.
А первый способ просто подряд совершенно одинаковые массивы выдает с частотой примерно один из восьми

iNils 29.10.2006 03:14

Wolsh, не фига не понял того что ты написал.

Wolsh 29.10.2006 03:22

Вот трейс:
Код:

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

Так понятно? Как ты вытащишь какое-то число с гарантией, что в следуюшем шейке не получишь по этому индексу тоже самое?

iNils 29.10.2006 03:24

Сортируется массив и идет обращение каждый раз к следущему индексу пока не достигнем конца массива.

Хемуль 29.10.2006 03:24

Цитата:

Сообщение от Wolsh
Думаю, товарищ сформулировал неверно. Понятно же и так, чего он хочет - чтобы два раза подряд один и тот же мувик не пошел

Мне не понятно. Я понял так, что имя не должно повторяться в рамках одного прохода массива...

Wolsh 29.10.2006 03:35

Цитата:

Сообщение от iNils
Сортируется массив и идет обращение каждый раз к следущему индексу пока не достигнем конца массива.

Угу. А потом шейк и по-новой? Или шейк перед каждым мувиком. я всётаки настаиваю чтобы задача рассматривалась как она поставлена. После замечания Хемуля о том что должны проиграть все мувики в одном цикле я признаю что мой код не подходит, в нем может вызваться позапрошлый мувик. Но я чёто никак не допетрю, как этот код __etc присобачить к данной проблеме?

Wolsh 29.10.2006 03:37

Смотри в трейсе:
строчки 3 и 4. Мувик 2 повторится.
строчки 4 и 5. Мувик 9 повторится.

iNils 29.10.2006 03:38

Вопрос стоял так
Цитата:

как сделать, что бы если запускаешь функцию, то выводилось например "А", но неповтрялось вторично, а сдедовало за ним следущие "С" или "В", тоесть отбор случайности не повторялся до тех пор пока все елементы массива не пройдут...

Wolsh 29.10.2006 03:43

Хорошо, а вот что на душе у человека наболело:
Цитата:

Сообщение от Mr. Fixit
Проблема:
Незнаю как решить задачу...
-------------------------------
на сцену выводится, то "A" 2-раза, то "B" n-раз, то "C" n-раз...
----------------------------------------------


iNils 29.10.2006 03:46

Цитата:

Сообщение от Wolsh
Хорошо, а вот что на душе у человека наболело:

Это замечание некорректное, так как вырвано из контекста текущего кода автора вопроса.

Хемуль 29.10.2006 03:49

Товарищи, вообще-то ещё в 7-ом сообщении темы автор поблагодарил всех за помощь, что наводит на мысль о том, что его удовлетворил тот код, который ему предоставили ранее, поэтому в своих спорах о том, чего же хотел автор, стоит отталкиваться от того, что было написано с первого по 7-ое сообщение. ^_^

Wolsh 29.10.2006 03:50

Серьёзно? :) Ну ладно тогда, мы тут достаточно понаписали, придет автор и возьмёт что ему надо. У меня 6 утра, я спать.

Mr. Fixit, только мой код никогда не повторяет подряд два мувика, хотя возможна последовательность 1,2,1,2 при наличии в массиве 3, 4, и 5.
Остальные хорошо тусуют их в массиве, но при переходе к следующему показу массива возможен повтор последнего мувика.
Выберите, что вам подходит.

Это чтоб никто не путался в наших решениях :)

etc 29.10.2006 04:32

Мммм, да я вообще привёл вариант shuffle… И он, ессно, не является решением задачи.

Mr. Fixit 29.10.2006 11:32

Спасибо..
проблема была в том что-бы по 2 раза не выбирало одно и тоже...


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

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