![]() |
алгоритм расстановки случайных чисел в одномерном массиве с условиями
Здравствуйте!
Пытаюсь разработать алгоритм расстановки случайных чисел в одномерном массиве, ограниченной определёнными условиями. Планировал делать это простым перебором: 1. Присваиваю ячейке случайное число, чтобы проверить, подходит ли оно 2. Проверяю условия (в-основном, это сравнение с другими ячейками) 3. Если условие выполняется - перехожу к следующему условию. Если не выполняется, уменьшаю число на 1 и повторяю проверку всех условий с самого начала 4. Если все условия выполнились, ставлю триггер успеха проверки и перехожу к следующей ячейке. Однако прежде, чем вставлять какие-то условия, я решил на примитивном примере оценить быстродействие такой схемы: Код AS3:
Казалось бы, элементарные вычисления (проверок 100, но условие всего одно), но каждый раз, когда они происходят, игра зависает на пару секунд. Объясните, пожалуйста, почему так, и какой способ циклической проверки будет более эффективен? Заранее спасибо! |
Здесь на форуме есть теги AS3 подсветки, нужно пользоваться ими для оформления своего кода. Такой одноцветный код даже читать не охото.
Не нужно делать циклы типа while(!ok). В as3 все выполняется в одном потоке и циклы не исключение. Подобное условие может либо очень долго не выполниться, либо вообще не выполниться. Зависание в этом случае гарантировано. Циклы нужно ограничивать в количестве итераций. Но конкретно об этом цикле, я сомневаюсь, что из-за него игра зависает на пару секунд. Это просто невозможно. 100 простых итераций он отработает мгновенно. Явно дело в чем-то другом. |
Цитата:
|
дополнил свой ответ
|
Цитата:
Тем не менее, остаётся вопрос: какой алгоритм использовать для расстановки случайных чисел (допустим, от 0 до 9) в одномерном массиве длиной в 8 ячеек, со следующими ограничениями: - не больше 6 чисел, отличных от 0; - не больше 4 одинаковых чисел; - не больше 2 одинаковых числе подряд. Мне на ум приходит 2 варианта: 1. Присваивать по-очереди каждой ячейке случайное число и проверять, подходит ли оно, уменьшая на 1 в случае неудачи, вплоть до 0; 2. Присвоить случайные числа сразу всем ячейкам, затем проверять условия сразу по всем и, если где-то косяк, присвоить новую комбинацию - и так до тех пор, пока комбинация не окажется удачной. Какой подход лучше: 1, 2 или есть другие? |
У Вас всего 6 ячеек, на которые 9 цифр (1..9). Так что пункты 2 и 3 можно вообще откинуть и использовать ВСЕ разные цифры по одной (кроме заранее забитых двух нулей).
Создаете массив [1, 2, 3, 4, 5, 6, 7, 8, 9], это будет массив-"пул", из которого Вы просто дергаете по рандомному индексу число (удаляете его из пула!) и добавляете в свой массив блоков. Затем рандомно вставляете два нолика. |
Цитата:
|
"не более 4 одинаковых" — добавляйте в пул по 4 одинаковых.
"не более 2х подряд" — Узнать, что две предыдущие равны добавляемой не проблема. Проверяете последнюю в блоках, если равна то проверяете предыдущую. Последнюю можно даже хранить в переменной чтоб "далеко не ходить". Это поможет также избежать лишнего повтора на стыках "волн". |
Попробовал сделать, как вы сказали.
Напоминаю условия: - массив из 10 ячеек необходимо заполнить случайными цифрами от 0 до 9 с соблюдением ряда условий - первая и последняя ячейка всегда 0 - максимальное количество не нолей - 6 - максимальная цифра известна заранее - максимальное количество одинаковых цифр: единиц, двоек, троек по 4, 4-6 максимум по 3, 7-8 максимум по 2, девятка только одна - максимальное количество одинаковых цифр подряд - 2 Вот что получилось: Код AS3:
1. Выглядит не очень, поможете оптимизировать? 2. Не соблюдается правило "не больше 6 цифр, отличных от нуля". В какой момент и как Цитата:
|
1. Конечно. Надо взять только последний, самый длинный вариант bag. А вот чтобы не брать из него дальше нужного индекса, надо всего-лишь ограничить рандом не реальной длиной массива, а максимальным для данного левела индексом (для первого — 11, для второго — 15 и тд.). Ах да, тогда придется с каждым вынутым числом менять и максимум(( Не очень красиво наверно)))
2. "Не больше шести..." — так если Вы будете брать из мешка всего шесть чисел, включая ноли, то "ненолей" больше шести никак и не получится. Берете шесть чисел из мешка, а ПОТОМ вставляете еще два ноля в рандомные индексы от 2 до 7 (чтобы не касались нолей по краям массива). И так у Вас в массиве будет минимум 4 ноля и максимум 6 ненолей. |
Цитата:
Что, если сделать так: после того, как массив сформирован, пройтись по нему ещё раз, посчитать нули и, если их окажется меньше, чем нужно, заменить нулями произвольные цифры в массиве? По остальным замечаниям исправляю UPD: А, понял, как сделать, сейчас поменяю Добавлено через 1 час 1 минуту Большое спасибо, всё работает! Получилось вот что: Код AS3:
|
var max_bag_index:uint; — должен быть инт, так как подвергается декременту в теле цикла.
var bag:Vector.<uint> — по сути константа, надо объявить и инициализировать один раз, чтобы не тратить драгоценные пикосекунды. while (testee == previous1) { if (testee == previous2) { — чтобы не делать if на каждом витке while, можно заключить while в условие if (previous1 == previous2). Это состояние неизменно и определяет необходимость проверки testee вообще — если два предыдущих не равны, то пофиг чему равен testee. |
Добавлю к предыдущему своему комментарию в другой теме: необходимо ознакомиться с конвенциями именований AS3. В данном случае неверно записаны имена у локальных переменных. А еще советую польоваться автореформатом кода в той IDE, где Вы пишете код (если это не FlashIDE, конечно).
|
Цитата:
Код AS3:
Цитата:
Цитата:
|
Цитата:
В as3 принято использовать верблюжий регистр (camel case). То есть вместо max_bag_index, нужно писать maxBagIndex Локальные переменные начинаются с маленькой буквы. Публичные переменные тоже, а приватные начинаются с андерскора _ Код AS3:
|
Цитата:
|
Цитата:
|
Цитата:
|
По ссылке выше написано почти все неверно. https://sourceforge.net/adobe/flexsd...20Conventions/
|
Цитата:
Если уж не читая конвенции делать, но стоило бы посмотреть на то, как пишут сами адобовцы. п.с. Кстати, названия интерфейсов в виде прилагательных (оканчивающихся на able) принято в Java, но не в as3. А переменные через андерскор пишут где-нибудь в php. Цитата:
|
Цитата:
Добавлено через 2 минуты Цитата:
|
Цитата:
Наверное, самый известный интерфейс после IEventDispatcher :) |
Да, но где-то у Мука по-моему, было как раз про это написано. Что названия интерфейсов в AS3 образуются от названия классов, простым добавлением заглавной буквы I перед названием.
А в конвенциях джавы никакой I не требуется, зато название обязательно должно быть прилагательным |
Да кому нужна эта джава)
|
Цитата:
|
Ох, не обращай внимания, просто я немного под впечатлением. Недавно, на досуге начал изучать си++, и теперь любой не компилируемый язык кажется лишь жалкой пародией.
|
а разве создание байт-кода нельзя назвать компиляцией?
|
Можно, джава как раз компилируемый язык
|
Под компилируемыми языками обычно подразумеваются те, что из исходного кода переводятся в непосредственно машинные команды: https://ru.wikipedia.org/wiki/%D0%9A...BD%D0%B8%D1%8F
|
Опять жаву унизили))))
Впрочем тема во флуд скатилась |
Цитата:
Цитата:
|
| Часовой пояс GMT +4, время: 13:23. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.