Форум 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=212580)

a7s1h1 18.03.2016 01:01

Цитата:

Сообщение от Wolsh (Сообщение 1192749)
если Вы будете брать из мешка всего шесть чисел, включая ноли, то "ненолей" больше шести никак и не получится. Берете шесть чисел из мешка, а ПОТОМ вставляете еще два ноля в рандомные индексы от 2 до 7 (чтобы не касались нолей по краям массива).

Во время перебора ячеек в цикле приходится проверять предыдущие, из-за чего ячейки проверяются по-очереди. С таким подходом приходится брать из мешка все 8, т.к. если брать 6, то два нуля окажутся с краю.
Что, если сделать так: после того, как массив сформирован, пройтись по нему ещё раз, посчитать нули и, если их окажется меньше, чем нужно, заменить нулями произвольные цифры в массиве?

По остальным замечаниям исправляю

UPD: А, понял, как сделать, сейчас поменяю

Добавлено через 1 час 1 минуту
Большое спасибо, всё работает! Получилось вот что:
Код AS3:

// максимальная цифра
                        var max_level:uint=MyMath.randomRange(0,9);
 
                        // вектор для вычислений из 8 ячеек (крайние останутся нулями, а ещё 2 ноля добавим потом)
                        var temp_vector:Vector.<uint> = new < uint > [0,0,0,0,0,0,0,0];
 
                        // если максимальная цифра = 0, то ничего не проверяем
                        if (max_level > 0) {
                                // создаём мешок с цифрами, откуда будем их тянуть (rjkbxtcndj одинаковых цифр в мешке означает их максимально допустимое количество в итоговом массиве)
                                var bag:Vector.<uint> = new <uint>[0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,5,5,5,6,6,6,7,7,8,8,9];
                                var max_bag_index:uint; // максимальный индекс в мешке
                                // количество элементов мешка, которое мы будем проверять, зависит от максимальной цифры
                                switch (max_level) {
                                        case 1: max_bag_index = 9; break; // 1 не более 4 [0,0,0,0,0,0,1,1,1,1]
                                        case 2: max_bag_index = 13; break; // 2 не более 4
                                        case 3: max_bag_index = 17; break; // 3 не более 4
                                        case 4: max_bag_index = 20; break; // 4 не более 3
                                        case 5: max_bag_index = 23; break; // 5 не более 3
                                        case 6: max_bag_index = 26; break; // 6 не более 3
                                        case 7: max_bag_index = 28; break; // 7 не более 2
                                        case 8: max_bag_index = 30; break; // 8 не более 2
                                        case 9: max_bag_index = 31; break; // 9 не более 1
                                }
 
                                var testee:uint=0;        // проверяемая цифра
                                var previous1:uint = 0; // предыдущая цифра
                                var previous2:uint = 0; // препредыдущая цифра
                                var tvl:int = temp_vector.length; // длина временного вектора для ссылки в цикле
 
                                // перебор каждой ячейки, кроме первой (0) и последней(7) (получается 6)
                                for (var i:int = 1; i < tvl - 1; i++) {
                                        var ind:uint = MyMath.randomRange(0, max_bag_index); // выбираем случайную ячейку мешка
                                        testee = bag[ind]; // переносим цифру из случайной ячейки мешка  в переменную для проверки
 
                                        // если выбранное число совпадает с предыдущим
                                        while (testee == previous1) {
                                                // если при этом совпадает ещё и с предпредыдущим - ищем в мешке другое число, пока не найдём такое, которое повторяло бы одновременно 2 предыдущих цифры
                                                if (testee == previous2) {
                                                        ind = MyMath.randomRange(0, max_bag_index); // повторяем вытягивание цифры из мешка
                                                        testee = bag[ind]
                                                } else {
                                                        break
                                                }
                                        }
 
                                        // найдя подходящую цифру, заносим её в соответствую ячейку вектора , записываем предыдущие цифры и удаляем выбранную из мешка
                                        temp_vector[i] = testee; // найдя подходящую цифру, заносим её в соответствую ячейку вектора
                                        previous2 = previous1; // записываем предыдущие цифры
                                        previous1 = testee;
                                        bag.splice(ind, 1); // удаляем из мешка ячейку, из которой вытянули подходящую цифру
                                        max_bag_index--; // уменьшаем максимальный индекс мешка, чтобы не залезть в его лишние цифры, которые идут дальше
                                }
                        }
                        // получился массив из 8 ячеек, крайние равны 0
                        // добавляем 2 нуля в произвольные места массива, кроме крайних ячеек. Итого у нас в 10 ячейках 4 нуля (2 по краям, 2 в произвольных местах). Остальные цифры - случайные (в т.ч. могут быть нули)
                        temp_vector.splice(MyMath.randomRange(1, temp_vector.length - 2), 0, 0)
                        temp_vector.splice(MyMath.randomRange(1,temp_vector.length-2),0,0)
 
                        trace('temp_vector='+temp_vector)


Wolsh 18.03.2016 09:00

var max_bag_index:uint; — должен быть инт, так как подвергается декременту в теле цикла.
var bag:Vector.<uint> — по сути константа, надо объявить и инициализировать один раз, чтобы не тратить драгоценные пикосекунды.
while (testee == previous1) { if (testee == previous2) { — чтобы не делать if на каждом витке while, можно заключить while в условие if (previous1 == previous2). Это состояние неизменно и определяет необходимость проверки testee вообще — если два предыдущих не равны, то пофиг чему равен testee.

КорДум 18.03.2016 11:03

Добавлю к предыдущему своему комментарию в другой теме: необходимо ознакомиться с конвенциями именований AS3. В данном случае неверно записаны имена у локальных переменных. А еще советую польоваться автореформатом кода в той IDE, где Вы пишете код (если это не FlashIDE, конечно).

a7s1h1 18.03.2016 11:08

Цитата:

Сообщение от Wolsh (Сообщение 1192759)
var bag:Vector.<uint> — по сути константа, надо объявить и инициализировать один раз, чтобы не тратить драгоценные пикосекунды.

Константой её сделать не получится, ведь, когда из мешка достаётся цифра, соответствующая ячейка из мешка удаляется:
Код AS3:

bag.splice(ind, 1)

Добавлено через 8 минут
Цитата:

Сообщение от КорДум (Сообщение 1192763)
Добавлю к предыдущему своему комментарию в другой теме: необходимо ознакомиться с конвенциями именований AS3. В данном случае неверно записаны имена у локальных переменных.

Про конвенции я прочитал, везде, вроде исправил. Видимо, что-то упустил. Можете привести пример, где неправильно?

Цитата:

Сообщение от КорДум (Сообщение 1192763)
А еще советую польоваться автореформатом кода в той IDE, где Вы пишете код (если это не FlashIDE, конечно).

Код пишу во FlashDevelop. "Автореформат" - это Refactor-Code Formatter? Он мне всё по абзацам разбил - теперь всё выглядит предельно наглядно, но очень непривычно (например, я привык фигурные скобки ставить не на следующей строке, а сразу после условия/функции - это разве плохо?)

caseyryan 18.03.2016 11:22

Цитата:

Про конвенции я прочитал, везде, вроде исправил. Видимо, что-то упустил. Можете привести пример, где неправильно?
Пример: max_bag_index
В as3 принято использовать верблюжий регистр (camel case). То есть вместо max_bag_index, нужно писать maxBagIndex
Локальные переменные начинаются с маленькой буквы.
Публичные переменные тоже, а приватные начинаются с андерскора _

Код AS3:

// приватные
private var _someVar:Number = 0;
// публичные
public var someVar:Number = 0;
// локальные
var someLocalVar:Number = 0;


a7s1h1 18.03.2016 11:30

Цитата:

Сообщение от Wolsh (Сообщение 1192759)
чтобы не делать if на каждом витке while, можно заключить while в условие if (previous1 == previous2). Это состояние неизменно и определяет необходимость проверки testee вообще — если два предыдущих не равны, то пофиг чему равен testee.

И правда... Спасибо большое, исправил

КорДум 18.03.2016 11:32

Цитата:

например, я привык фигурные скобки ставить не на следующей строке, а сразу после условия/функции - это разве плохо?
Конкретно этот момент можно настроить где-то в настройках. Я сам не люблю, когда { на новой строке где бы то ни было, если иного не устанавливает code style команды, в которой я работаю.

a7s1h1 18.03.2016 11:38

Цитата:

Сообщение от caseyryan (Сообщение 1192767)
Пример: max_bag_index
В as3 принято использовать верблюжий регистр (camel case). То есть вместо max_bag_index, нужно писать maxBagIndex

У меня так и было раньше, но после замечания КорДума я полез вот сюда и исправил весь свой код в соответствии с рекомендациями, которые там изложены: "Все буквы в имени строчные, слова отделяются друг от друга символом подчёркивания, начинается с символа подчёркивания." Или это относится только к private, а локальные надо писать с верблюжим регистром, как методы?

КорДум 18.03.2016 11:53

По ссылке выше написано почти все неверно. https://sourceforge.net/adobe/flexsd...20Conventions/

caseyryan 18.03.2016 12:39

Цитата:

Сообщение от a7s1h1 (Сообщение 1192770)
У меня так и было раньше, но после замечания КорДума я полез вот сюда

Это хрень какая-то. Как уже написал КорДум, там почти все неверно.
Если уж не читая конвенции делать, но стоило бы посмотреть на то, как пишут сами адобовцы.

п.с. Кстати, названия интерфейсов в виде прилагательных (оканчивающихся на able) принято в Java, но не в as3. А переменные через андерскор пишут где-нибудь в php.

Цитата:

Конкретно этот момент можно настроить где-то в настройках. Я сам не люблю, когда { на новой строке где бы то ни было, если иного не устанавливает code style команды, в которой я работаю.
Tools - Program Settings - FlashDevelop - Coding Style Type - BracesOnLine


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

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