![]() |
Как random поменять на Math.random()
Добрый день!
Как random в этом коде Код AS1/AS2:
|
Код AS1/AS2:
|
А если значений больше:
Код AS1/AS2:
|
Код AS1/AS2:
|
to gloomyBrain
Страшно даже)) Зачем столько строк писать когда одной можно. Код AS1/AS2:
|
Код AS1/AS2:
|
спасибо, буду пробовать
|
Только не round, а floor.
|
А чем Вам round не нравится?
Код AS1/AS2:
|
Цитата:
upd: обнаружил такую вещь: Код AS1/AS2:
sumA 128 sumB 100 sumA 116 sumB 100 sumA 117 sumB 100 Т.е. выражение a[Math.round(Math.random() * 4)]++; работает непонятным мне образом. При настройках публикации AS3 и там и там 100, как и предполагалось. Это какой-то баг о котором я не знал? В курсе кто-нибудь? |
Цитата:
|
В принципе - баг, надо искать Флазм и смотреть почему так происходит. На сколько я знаю, флеш никогда не использовал unsafe pointers, так что причина скорее всего в вом, что оно где-то число принимает за строку... кстати, надо еще MTASCом попробовать скомпилить и посмотреть, что будет.
Хмм... MTASC такой же результат выдает, значит, скорее всего бага плеера... |
wvxvw, спасибо за ответ.
Хоть и не понятно в чем конкретно баг заключается, но теперь буду осторожней с такими выражениями обращаться. |
Кстати, врезультате тестов появилось следующее:
Код AS1/AS2:
Код AS1/AS2:
Самое интересное то, что если вычитать а не складывать, то результат опять же будет неправильным... и если последовательно трейсить trace(a) в первом цикле, то видно, что иногда массив не изменяется... вобщем, скорее всего какай-нибудь пропущенная команда в сгенерированом коде, либо плеер неправильно читает команду (забывает при каких-то обстоятельствах)... |
Цитата:
|
Онa все равно приватная :p
На самом деле самое глупое в этом - это ошибки кидать / ловить в AS2. В большинстве случаев плеер их сам отрабатывает и не дает до них добраться... :( т.е. если функция вернулась с ошибкой а ее вызвала другая функция, то в третей функции, которая вызвала вторую про ошибку уже все забыли, просто где-то undefined будет... Страшно подумать, что на этом когда-то что-то всерьез писалось... Хех, еще обиднее - оказалось, что кастовать по ссылке нельзя - очевидно компилятор не умел этого делать, просто раньше я даже не задумывался о необходимости такой штуки :) |
Код AS3:
|
Цитата:
k выпадает каждую итерацию. И в сумме должно получиться 100 по идее. |
Код:
movie 'loop.swf' // flash 9, total frames: 1, frame rate: 12 fps, 550x400 pxНе знаю, я не вижу почему бы второй вариант должен так странно себя вести, скорее всего - баг плеера а не компилятора. (Хотя первый вариант все равно оптимальнее). |
Собственно все и так ясно.
Выражение Код AS1/AS2:
Код AS1/AS2:
С b все ясно, так как "k" в выражении Код AS1/AS2:
В avm2 переписали инкремент, поэтому левая часть для a берется из правой части. |
Очень интересно :)
То есть в avm2 вызов Math.random() будет один - но как то нелогично, что берет из правой части, наверное, логичней было бы брать с левой? 2udafff: точно, голова кипит :) |
Ну, это мое предположение, что переписали, а не факт. :)
Просто проверить легко, вместо рнд впихнуть в массив вызов функции, где рнд и будет формироваться, потом в трейс и на выход в return. В avm1 два трейса, в avm2 - один. |
Цитата:
Посмотри на дамп: - вызов Math.random() во втором случае только 1 раз. - даже если бы он вызывался 2 раза - какая разница какой из элементов массива инкрементить? Судя по всему почему-то, в какой-то ситуации значение из стека не присваевается обратно элементу в массиве. EDIT: Ой, сорри - был не прав, проморгал, действительно Math.random() вызывается 2 раза... :( Чет я проглядел |
А кто может на примере объяснить почему Math.floor()
Код AS1/AS2:
Код AS1/AS2:
Цитата:
Цитата:
|
AzagThoth, если вы пишете аналог random() с использованием Math.random(), то вам нужно знать, что random() возвращает целое число от 0 до N, не включая N.
|
Эти два варианта
Код AS1/AS2:
Ежели использовать для round множитель не длины, а номер индекса, то вас ждет разочарование - равномерного распределения не будет. Пример Код AS3:
Цитата:
А с round распределения идут в таком соотношение: 1/8, 1/4, 1/4, 1/4, 1/8. Почему? Да потому, что целое число X (0<X<4) будет получаться от не целых чисел X-0,5..X+0,5 (диапазон равен 1), а числа 0 и 4, от 0..0,5 и 3,5..4 (диапазон равен 0,5), поэтому вероятность для чисел 1,2,3 будет в два раза больше, чем для 0 и 4. |
Всё, понял. Большое спасибо! Очень наглядно.
|
| Часовой пояс GMT +4, время: 11:53. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.