PDA

Просмотр полной версии : Случайный массив


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
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
29.10.2006, 03:35
Сортируется массив и идет обращение каждый раз к следущему индексу пока не достигнем конца массива.
Угу. А потом шейк и по-новой? Или шейк перед каждым мувиком. я всётаки настаиваю чтобы задача рассматривалась как она поставлена. После замечания Хемуля о том что должны проиграть все мувики в одном цикле я признаю что мой код не подходит, в нем может вызваться позапрошлый мувик. Но я чёто никак не допетрю, как этот код __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
Хорошо, а вот что на душе у человека наболело:
Проблема:
Незнаю как решить задачу...
-------------------------------
на сцену выводится, то "A" 2-раза, то "B" n-раз, то "C" n-раз...
----------------------------------------------

iNils
29.10.2006, 03:46
Хорошо, а вот что на душе у человека наболело:
Это замечание некорректное, так как вырвано из контекста текущего кода автора вопроса.

Хемуль
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 раза не выбирало одно и тоже...