![]() |
Как "перемешать" элементы в массиве?
Есть определенный массив:
Код AS3:
Подскажите, пожалуйста, как быть? |
Как-то ваял.
Код AS3:
|
Код AS3:
|
У меня то же самое, но с приведением рандома с нормальных законом распределения к более-менее равномерному (у Чуви взял). Последствия очевидны.
|
КорДум спасибо огромное, то что нужно:)
|
Цитата:
|
По идее, нормальное ) Math.random() в as3 живет по этому закону. Чуви проводил эксперименты, рисовал графики. Потом дошел до метода какого-то там, наваял код, приводящий нормальное к равномерному, а я нагло стырил.
Добавлено через 8 минут А хотя по коду то же самое вообще у нас. Разве что у меня несколько раз можно "шуффлировать". |
Код AS3:
|
Пользуясь случаем.
Вот например я таким способом перемешиваю итемы которые должны появиться в игре. Итемов поровну - хороших (здоровье, броня) и плохих (мины, враги). И герой может выпить эликсир и его удача вырастает на 10%, на 20% или даже на 50%. Соответственно, нужно чтобы в этом массиве вероятность появления положительных итемов также вырастала (в зависимости от выпитого эликсира удачи). Вот как такое лучше сделать? |
Astraport, не ясно, как это может соотноситься с перемешиванием.
"вероятность появления" тех или иных элементов в массиве и перемешивание (т.е. изменение порядка следования) элементов никак не соотносятся. скорее тут надо рассмотреть формирование самого массива изначально. |
Цитата:
|
Решение в лоб: какова вероятность появления, столько копий (ссылок) значений/объектов в массиве. Если вероятности кругловыглядящие - 10%, 20% и так далее, то можно не 20 элементов втыкать в массив, а взять кратное 10, то есть 2. Затем перемешать это все и взять рандомный элемент.
|
а может 50 итемов отсортировать по степени "хорошести", выбирать необходимые N итемов с помощью нормального (Гаусовского) распределения случайных величин, со сдвигом мат ожидания, чем больше хороших вкусняшек съел игрок, тем мат ожидание ближе к хорошим индексам и наоборот, нужно только коэффициент рассеивания подобрать
|
КорДум, ну вот пока я думаю решать таким же способом: рандомно ищу в массиве хорошие итемы (если 10% эликсир - то 3 штуки, если 20% - то 6 штук и т. д.), добавляю их в исходный массив и потом уже перемешиваю и выбираю 20.
amesqit, это круто, но сложно:) |
зато весело :) где-то видел реализацию нормального распределения на as3, а остальное реализовать вообще дело не хитрое :)
|
Код AS3:
Код:
3,0,6,8,1,5,4,7,9,2 |
2Astraport
Я пользуюсь таким методом влияния на частоту рандомного выпадания элемента (похоже на лобовое решение КорДума): Создаю массив, сорозмерный масиву элементов и в каждую его ячейку пихаю неотрицательное число. Чем больше чило, тем больше вероятность выпадания элемента с таким же индексом, как и это число. Для выборки случайного элемента нужно: - просуммировать все числа (шансы на выпадание); - выбросить рандомное число от нуля, до посчитаной суммы; - пробегаясь от начала массива, суммировать все числа и сравнивать с полученым рандомны. Как толко текущая сумма будет равна выброшеному числу возвратить текущий индекс, если больше - предидущий индекс. По этому индексу я и получаю свой долгожданный элемент из набора. По идее, этот вариант имитирует запихание в один массив нескольких одинаковых эелементов. Но заменяет этот процесс указанием количества этих элементов. Пример: Код AS3:
|
Цитата:
Math.round(Math.random() * (_source.length - 1)) вроде бы эквивалентно int(Math.random() * _source.length), не? Как написать то же самое (1 в 1), но без сплайса и без создания другого массива (линейная сложность :) ): Код AS3:
|
http://soft.compulenta.ru/510956
Алгоритм Фишера-Йейтса реализации (говорим спасибо ChuwY) https://bitbucket.org/pavel_rybkin/y...zer?at=default |
Ну и еще вариант
Код AS3:
|
Вариант.
1. На каждую выпитую рюмку элексира увеличиваем количество "положительных" элементов в исходном массиве. Т.е увеличиваем "плотность" удачи. Соизмеримо, само-собой, исходя из разумных допущений и логики игры. 2. Перемешиваем массив одним из предложенных способов, например, как в посте udaaff'a. 3. Т.к. имеем дисбаланс плюсов и минусов в исходном массиве, на отдельном его участке [0,20] при равномерном распределении этот дисбалланс статистически должен присутствовать так же. |
Цитата:
Код AS3:
Чтобы в строчку его можно было поместить N=50; вместо var _source:Array = [1,2,3,4,5,6,7,8,9,0]; это: var _source:Array = [N]; и чтобы в итоге перемешивались не 10 данных, а сколько понадобится?.. |
Код AS3:
|
| Часовой пояс GMT +4, время: 15:19. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.