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

jediff 24.10.2011 16:52

Работа с массивом. Рандомное число
 
Всем привет.Нужна Ваша помощь

к примеру у меня есть массив
Код AS3:

 var massiv1:Array = new Array (1, 2, 3, 4, 5);

в output я хочу получить одно рандомное число из моего массива , всё никак не додумаю как это сделать,
делал так :

Код AS3:

 var massiv1:Array = new Array (1, 2, 3, 4, 5);
massiv1.math.random();
trace (massiv1);

конечно, это абсолютно не првавильно,к сожалению не знаю правильной формулы( жду вашей помощи Господа :)

Astraport 24.10.2011 17:00

Рандомизируйте числа длины массива.
massiv1[randomIndex] - даст нужный результат.

Inet_PC 24.10.2011 17:01

Код AS3:

trace (massiv1[Math.round(Math.random() * (massiv1.length-1))])


smithy 24.10.2011 17:02

Цитата:

Сообщение от Inet_PC (Сообщение 1041525)
Код AS3:

trace (massiv1[Math.round(Math.random() * (massiv1.length-1))])


Ваш вариант выдаст неверное распределение: первый и последний элементы будут встречаться в ~2 раза реже остальных.

Код AS3:

var massiv:Array= [1,2,3,4,5];
var random:int= massiv[int(Math.random()*massiv.length)];
trace(random);


jediff 24.10.2011 17:07

Цитата:

Сообщение от Inet_PC (Сообщение 1041525)
Код AS3:

trace (massiv1[Math.round(Math.random() * (massiv1.length-1))])


могли бы вы объяснить свою запись? а именно

* (massiv1.length-1)

на сколько я знаю свойство length подсчитывает количество элементов в массиве не пойму к чему здесь -1 :(

задаю такие вопросы, так как в русле неделю, вот хочу с массивами конкретно разобраться

Добавлено через 6 минут
Код AS3:

var massiv:Array= [1,2,3,4,5];
var random:int= massiv[int(Math.random()*massiv.length)];
trace(random);

[/quote]

Спасибо,Ваша запись понятна и работает

in4core 24.10.2011 17:14

Цитата:

не пойму к чему здесь -1
Массив считается с 0 индекса. Длинна массива отрицает 0. Тоесть длинна массива 10 элементов, но последний элемент есть массив[9] . И чтобы на него попасть нам надо написать -1

goodguy 24.10.2011 17:25

на самом деле это не обязательно, достаточно такой записи
Код AS3:

var randomIndex:int = int(Math.random() * array.length);

Цитата:

Ваш вариант выдаст неверное распределение: первый и последний элементы будут встречаться в ~2 раза реже остальных.
Откуда такие данные? Эта запись даст ткие же результаты, просто она более громоздка и неуклюжа

etc 24.10.2011 17:32

Цитата:

Сообщение от goodguy (Сообщение 1041537)
Откуда такие данные?

В силу работы округления до ближайшего.
И действительно реже:

Код AS3:

function test():void {
        var total:int = 5;
        var matches:int = 0;
        var i:int = 0;
        var c:int = 10000;
        var test:int;
 
        for (i = 0;i < c;i++) {
                test = int(total * Math.random());
                if (!test || test == total) matches++;
        }
 
        trace(matches); // 1993
        matches = 0;
 
        for (i = 0;i < c;i++) {
                test = Math.round((total - 1) * Math.random());
                if (!test || test == total) matches++;
        }
 
        trace(matches); // 1255
}
test();


Inet_PC 24.10.2011 17:39

Цитата:

Ваш вариант выдаст неверное распределение: первый и последний элементы будут встречаться в ~2 раза реже остальных.
Вы правы

GBee 24.10.2011 17:43

Даже интересно стало.
Код AS3:

public function Test():void 
                {
                        var total:int = 5;
                        var matches:int = 0;
                        var i:int = 0;
                        var c:int = 10000;
                        var test:int;
                        var arr:Array = [0,0,0,0,0];
 
                        for (i = 0;i < c;i++) {
                                test = int(total * Math.random());
                                arr[test]++
                        }
 
                        trace("int", arr);
 
                        arr = [0,0,0,0,0];
 
                        for (i = 0;i < c;i++) {
                                test = Math.round((total - 1) * Math.random());
                                arr[test]++
                        }
 
                        trace("round", arr);
                }

int 2002,1990,2045,1992,1971
round 1197,2534,2518,2530,1221

int 2009,1973,2025,2020,1973
round 1204,2534,2478,2511,1273

int 2063,1915,1983,1976,2063
round 1215,2495,2445,2565,1280

etc 24.10.2011 17:52

Все дело в том, что в случае с round, выпадение крайних значений вероятно лишь в диапазоне длиной 0.5, в отличие от остальных значений. В случае же с int диапазон равен единице на всех значениях.

GBee 24.10.2011 17:57

int как floor работает получается?

etc 24.10.2011 18:00

Ну в общем-то да. Т. е. тут неважно, int/floor.

gloomyBrain 24.10.2011 18:53

Для положительных - как floor, для отрицательных как ceil. int округляет в сторону нуля, а не вверх или вниз

etc 24.10.2011 18:56

Ах, ну да, он просто обрезает дробную часть.

Silicium 24.10.2011 21:22

есть еще метод Math.floor(); - с ним все в порядке)

goodguy 24.10.2011 21:25

а выше не о нем говорили? )
int быстрее, и для положительных чисел предпочтительнее.
Тут недавно кто-то даже измерениями занимался, и разница в скорости оказалась довольно существенной

smithy 24.10.2011 21:42

Цитата:

Сообщение от goodguy (Сообщение 1041693)
int быстрее, и для положительных чисел предпочтительнее.

Скажу больше, вот это
Код AS3:

value= int(number);
if ( value < 0 ) value--;

будет чуть-чуть быстрее чем Math.floor().

olexandr 25.10.2011 00:00

объясните этот момент
насколько я понимаю int(Math.random() * _arr.length)с небольшой вероятностью ведь может выдать и сам _arr.length. Math.random() ведь генерит от 0 до 1 включительно?

Inet_PC 25.10.2011 00:08

Math.random возвращает от 0,включительно до 1, не включая ёе, а int, обрезает дробную часть.

olexandr 25.10.2011 01:01

да, теперь все становится на свои места. никогда не смотрел хелп по таким элементарным вещам :)

Цитата:

Возвращает псевдослучайное число n, где 0 <= n < 1

Silicium 25.10.2011 10:46

Цитата:

а выше не о нем говорили? )
у, пардонте, не узрел )
Цитата:

Код AS3:

value= int(number);
if ( value < 0 ) value--;


немного не понятно. value < 0 будет, если number < 0, разве нет? Тогда зачем декрементировать значение? floor разве не по модулю должен работать?

-De- 25.10.2011 10:58

Цитата:

Сообщение от smithy (Сообщение 1041696)
Код AS3:

value= int(number);
if ( value < 0 ) value--;


number = -10;
...
value == -11 - ахтунг!

smithy 25.10.2011 13:32

Цитата:

Сообщение от -De- (Сообщение 1041752)
number = -10;
...
value == -11 - ахтунг!

Это замена Math.floor().
Например, int(-10.123) вернет -10, а Math.floor(-10.123) вернет -11.
Поэтому чтобы использовать int() вместо Math.floor() нужно проверять знак числа и вычитать единицу из отрицательного.

Zebestov 25.10.2011 15:13

Код AS3:

trace( massiv1[int(Math.random() * massiv1.length * 1234567) % massiv1.length] );


Silicium 25.10.2011 17:54

Код AS3:

Например, int(-10.123) вернет -10, а Math.floor(-10.123) вернет -11.

Не знал, так как никогда не юзал "пол" с отрицательными числами - и наивно полагал, что он по модулю округляет (то-есть в сторону нуля с обеих сторон). В чем смысл флора тогда, если преобразование типа быстрее? Или он как раз нужен в случае, если нам не известен знак аргумента. Интересно, что у него внутри?)

Добавлено через 50 секунд
Код AS3:

number = -10;
...
value == -11 - ахтунг!

и, кстати, действительно ахтунг...

etc 25.10.2011 18:30

Silicium, floor и int логически разные. Один занимается округлением, второй — конвертацией.

crazyone 25.10.2011 19:08

Цитата:

Сообщение от smithy (Сообщение 1041696)
Скажу больше, вот это
Код AS3:

value= int(number);
if ( value < 0 ) value--;

будет чуть-чуть быстрее чем Math.floor().

Цитата:

Сообщение от -De- (Сообщение 1041752)
number = -10;
...
value == -11 - ахтунг!

Да, ахтунг. Вот так подправить нужно:
Код AS3:

value= int(number);
if ( value >  number ) value--;


Genm 25.10.2011 22:15

У меня такие варианты:
Код AS3:

var maxRound:int = (int(value) != value) ? ((value < 0) ? int(value) : int(++value)) : value
var minRound:int = (int(value)!= value) ? ((value < 0) ? int(--value) : int(value)) : value


etc 25.10.2011 23:32

И в 99% случаев вся эта «скорость» нафиг не нужна. Посему нет никакого смысла заморачиваться и просто нужно использовать правильное в правильном месте.


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

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