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

delphic 25.01.2017 21:59

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

1 элемент а
2 б
3 в
4 г

теперь как можно сделать чтоб из этих элементов массива вытащить случайный

есть

Код AS3:

Math.round(Math.random())

но не пойму как соединить и в трейс вывести

и еще, если не затруднит покажите пример, допустим хочу что бы рандом был из 8 чисел
как это выглядит,т.е в диапазоне от 1 и до 8 трейсом выкидывало

не нужно очень усложненных махинаций, небольшой понятный пример

illuzor 25.01.2017 22:14

https://gist.github.com/illuzor/fdce...d90ec51b5d5c20

zackscript 25.01.2017 22:14

Код AS3:

var _nums:Array = ["a","b","c","d"];
trace(_nums[Math.round(Math.random()* _nums.length)])


Nooob 26.01.2017 00:26

zackscript, не round а floor

caseyryan 26.01.2017 06:14

или вообще
Код AS3:

var _nums:Array = ["a","b","c","d"];
trace(_nums[int(Math.random()* _nums.length)]);


delphic 26.01.2017 08:06

всем спасибо за ответы,но по ним есть вопросы

1) в чем различие между
Код AS3:

Math.round(Math.random()

и
Код AS3:

Math.floor(Math.random()

2)
Код AS3:

int(Math.random()* _nums.length)

что делает тут
Код AS3:

int

,превращат полученное в целое число?
3)если есть число 8, как из него вытащить рандом? т.е обязательно указывать диапазон или все таки можно просто указать цифру и из него генератор выберет какое то число

zackscript 26.01.2017 09:28

Цитата:

в чем различие между
round - округляет число в большую или меньшую сторону, например:
1.25 => 1;
1.79 => 2;
floor - всегда округляет до наименьшего значение числа, например:
1.25 => 1;
1.79 => 1;
Цитата:

что делает тут int ()
int () - это вызов глобальной функции которое преобразует (в вашем случае) из Number в тип int делая число целым например:
trace(int(1.23620078060775995)) => 1;

Zebestov 26.01.2017 10:25

zackscript, твой ответ неточен и неполон.
Исправление: Math.round(1.25) будет равен не 1, а 2.
Дополнение: Не помешает и пример с отрицательным значением. Так int(-1.234) будет равен -1. Это чтобы не казалось, что int() в самом общем случае дает тот же результат, что и Math.floor().

КорДум 26.01.2017 10:59

Цитата:

Исправление: Math.round(1.25) будет равен не 1, а 2.
Бестыч, ты чего? 1 будет, это же не ceil

Zebestov 26.01.2017 12:02

Кто-то не выпил свой утренний кофе или забыл школьную математику )
Цитата:

Если значение val равноудалено от двух ближайших целых чисел (когда в конце числа стоит «,5»), оно округляется в большую сторону до ближайшего целого числа.
Добавлено через 1 минуту
В итоге этот кто-то я ))) там же не 1.5 )) пошел пить кофе!

delphic 26.01.2017 13:26

понятно объяснили, а насчет числа что скажете?

рандом из 8 например, нужно писать диапазон от 1 до 8,или можно указать просто 8 и генератор сам выбирает

ZackMercury 26.01.2017 14:06

delphic, вы вообще не поняли то, как работает предложенное выше?
Math.random() возвращает случайное число от 0 до 1(например, 0.7584125, или 0.941255124, или 0.30000)
Это значит, что, (если у вас присутствует школьное образование) если умножить это число на любое другое число - рандом будет от 0 до этого числа.
Например:
Код AS3:

Math.random()*arr.length;

- рандом от 0 до длины массива.
В данном случае, если округлять, вместо отбрасывания целой части:
Код AS3:

Math.round(Math.random()*arr.length);

Достаточно немного подумать, чтобы понять, что максимальное число, получаемое в результате этой операции будет равным длине массива(а последний элемент массива всегда имеет индекс на единицу меньше длины), значит это нам не подходит.
Так как никогда не выпадает единица, никогда не выпадет ровно число, на которое вы умножаете Math.random, оно будет всегда чуточку меньше. Поэтому, мы можем просто отбросить дробную часть с помощью int().
Код AS3:

int(Math.random()*arr.length);

- вернётся псевдорандомный индекс массива

Цитата:

диапазон от 1 до 8
Берём минимальное, максимальное значение и разницу между ними.
нам нужно, чтобы рандом был между минимальным и максимальным, а значит мы
вычитаем из максимального минимальное, и получаем число, на которое нам нужно умножать Math.random().
Затем думаем, как нам получить рандомное число между минимальным и максимальным.
Вуаля!
Код AS3:

var min:int = 1;
var max:int = 8;
var result:int = min + int(Math.random()*(max - min));

Вывод: в школе надо учиться.

delphic 26.01.2017 15:18

я лишь спрашивал - рандом из 8 например, нужно писать диапазон от 1 до 8,или можно указать просто 8 и генератор сам выбирает.
при чем тут школа
можно было написать
Код AS3:

trace(Math.random())

и узнать что он возвращает, я не знал как именно он отрабатывает, оказывается да от 0 и до 1 и умножив на число получаем диапазон
я не понимал как именно генерируется,я думал что Math.random берет число и из него как то вычисляет,оказывается проще,всем спасибо

ZackMercury 26.01.2017 15:25

Math.random() использует текущее время в миллисекундах в качестве Seed для псевдорандомного генератора. Он берёт это число, и из него вычисляет, но вам это знать не обязательно.
Всё, что вам нужно знать - это то, что Math.random() возвращает вещественное число [0; 1). Остальное легко написать вручную, зная элементарную школьную математику.

caseyryan 27.01.2017 05:52

Цитата:

это вызов глобальной функции которое преобразует
Это не вызов глобальной функции, а конвертация типа. Число преобразуется из Number в int, при этом дробная часть отсекается. Этот способ далеко не всегда хорош, так как разрядность числа int, гораздо меньше, чем Number. Например new Date().time возвращает Number, хоть и без дробной части, и сконвертировать его в int не получится без сокращения
С округлением все просто
floor - дословно "пол", то есть в меньшую
ceil - (от англ. ceiling) дословно "потолок", то есть в сторону большего
round - округление по законам математики

Wormhole 29.01.2017 22:41

Цитата:

Сообщение от caseyryan (Сообщение 1198842)
Это не вызов глобальной функции, а конвертация типа.

Лично я всегда думал, что int(obj) - это сокращение от new int(obj) и, по сути, возвращает новосозданный инт, соответствующий переданному объекту

caseyryan 30.01.2017 06:19

Цитата:

Сообщение от Wormhole (Сообщение 1198910)
Лично я всегда думал, что int(obj) - это сокращение от new int(obj) и, по сути, возвращает новосозданный инт, соответствующий переданному объекту

Нет. Новый объект получается только с использованием директивы new и никак иначе

Nooob 30.01.2017 22:47

Цитата:

Сообщение от caseyryan (Сообщение 1198921)
Нет. Новый объект получается только с использованием директивы new и никак иначе

не только
Код AS3:

var obj:Object = {};
var arr:Array = [];
var xml:XML = <xml />;
var rgx:RegExp = /a(.*?)b/g;
var str:String = "";

Конвертация тоже создает новый объект.

Код AS3:

var a:int = 1;
var b:int = new int(1.1);
//эквивалентно
var c:int = int(1.1);

тоже создание объекта, просто этот объект другого атомарного типа, по другому конструируется и хранится

Wormhole 03.02.2017 13:55

Цитата:

Сообщение от Nooob (Сообщение 1198940)
объект другого атомарного типа, по другому конструируется и хранится

Стало интересно узнать про это подробнее. Что понимается по атомарным типом и в чем отличия типа после каста от int'а, который создается с помощью new


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

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