Информация

Обсуждало 12 человек

Опрос от автора

Чтобы принять участие в голосовании, зарегистрируйтесь, пожалуйста!

Как написать генератор псевдослучайных чисел

ActionScript 1.0/2.0
08 апреля 2013 в 12:29:15

Инструкция для нубов!

Условные обозначения:
х - любое число;


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

Способ 1:
Существует функция random(x), генерирующая число в диапазоне от 0 до x-1 (где х - аргумент функции random() ). Почему х-1? Давайте выясним:
В жизни счёт идёт с единицы, но в программировании счёт идёт с нуля. То есть, код:
trace( random(2) ); // никогда не выдаст 2

при компиляции, в окне Output выдаст 0 или 1, но в любом случае увидеть там 2 не получится.

Способ 2:
Но сгенерировать псевдослучайное число в том же самом диапазоне мы можем и другим методом:
Math.random() * x

Но такой метод выдаёт нам дробное число. Как же сгенерировать целое число таким способом?
Для этого есть функция int() (округление числа).
Пример использования int() вместе с Math.random() * x:
trace( int(Math.random() * 5) ); // на выходе даст число от 0 до 4


Практика:
Задача: написать программу "Ваше счастливое число" на ActionScript 2.0.
Решение:
var maxnum = 100 + 1; // максимальное значение, которое сможет выдать генератор (в моём случае - 100) trace("Ваше счастливое число - " + random(maxnum)); // на выходе даёт: "Ваше счастливое число - х"

Пояснение кода:
В переменной maxnum я написал: "+ 1" после 100 (выбранное мной число) по причине, описанной выше.
--------------------
Спасибо за внимание!

UPD: Поскольку кое-кто сказал, что приставка "псевдо" тут не нужна, то я объясню, почему числа, полученные таким методом, псевдослучайны.
Во-первых, все функции рандома, которые используют некий источник, с которым проводят ужаснейшие вещи, в *nix, например, источником является счётчик тактов процессора, затем используют LFSR с последующим хешированием выхода через SHA-1. То есть, источник можно сделать фиксированным(но только с помощью программного вмешательства в код генератора, таки да), и тогда на выводе получится одно и то же число. Истинно случайные числа получаются с помощью физических шумов. Теоретически, случайное число можно получить даже из космического шума.

Обновлено: 11 сентября 2013 в 09:38:47

Обсуждение (вниз)

12
Загружаем страницу...

Не хватает только вашего мнения. Зарегистрируйтесь, чтобы написать!

24 декабря 2014 в 12:23:07

наверно не получится, ведь каждое следующее число рассчитывается по параметрам предыдущего. Только если подставить параметры от 14-го числа и запустить генератор, по идее должно получиться 15-е. И тогда можно сделать как в видео - через каждые 100 чисел, например, ключевой кадр. Который где-то сохраняется, и потом рассчёт идёт не сначала, а от него.

23 декабря 2014 в 22:36:57

а что если к зерну еще добавить кординаты? хД типа там какое то ключ+ кординаты и у тебя на какое то точке будет всегда одинаковое но рандомный блок хД

23 декабря 2014 в 22:12:07

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

11 сентября 2013 в 19:05:26

Ого, час потратил на написание.=) И еще кое что требует уточнения.
Таки научись программировать, а потом вые6уйся

Ок.=)

11 сентября 2013 в 18:10:43

No problem!=)

11 сентября 2013 в 18:05:46

Denis, problem?

11 сентября 2013 в 18:04:05

...

11 сентября 2013 в 09:14:40

Pett подъебал Denis'a хД

09 сентября 2013 в 21:34:37

Таки напишу туториал.=)

Таки научись программировать, а потом вые6уйся

09 сентября 2013 в 20:32:53

Denis опа не заметил твой наезд!!!!

09 сентября 2013 в 16:37:17

Таки напишу туториал.=)

09 сентября 2013 в 16:11:04

Окей=)

09 сентября 2013 в 14:59:15

Denis, ну чего развыебывался-то?
Ну и рандом - это действительно, не случайное число, а псевдослучайное.

09 сентября 2013 в 14:56:26

А это название "псевдослучайные числа" тут вообще не к месту, лучше просто "случайные числа"

Как раз тут оно и к месту, т.к. числа эти не совсем случайные. Да и вообще они нифига не случайные. Если ты запустишь функцию генерации этих чисел 2 раза с одним и тем же стартовым параметром, то получишь две идентичные последовательности чисел.

09 сентября 2013 в 14:39:38

iDenChig , я и без твоих примеров знаю, что для строк + это их соединение, а для цифр это сложение. То есть:
"4" + "3" = "43" 4 + 3 = 7

09 сентября 2013 в 14:33:59

Знаешь, лучше просто:
trace(Math.floor(Math.random() * x) + 1);

Вместо x граница выбора целого случайного числа.(включительно!)
А это название
псевдослучайные числа
тут вообще не к месту, лучше просто
случайные числа

05 мая 2013 в 20:25:55

Ну это маленький примерчик такой, поэтому видать все косяки сразу а вот если в громокоде какомнить ошибка весьма затруднительна.

05 мая 2013 в 20:24:50

var a:String = "2", b:String = "5", c:int;
trace(c = int(a + b));
Вот так вот получится но заместо 7 будет 25

05 мая 2013 в 20:23:33

Допустим так вот у тебя не получится:
var a:String = "2", b:String = "5", c:int;
trace(c = a + b);

05 мая 2013 в 20:19:59

Denis при переводе из строки в число тоже много нюансов есть. Так же как и из числа в троку, нужно знать когда понадобится toString() а когда притатыч сам все поймет.

05 мая 2013 в 18:30:53

Может еще стоит написать о переводе строки в число и обратно?!=)
P.S.:Я знаю как перевести, я не идиот.

16 апреля 2013 в 03:37:32

ну хз, я сначала разобрался с IDE (ещё етс тогда мне рассказывал, как во Flash MX создать пустой ключевой кадр хДДДДД), а потом начал кодить простейшие проги (тут уже не без гугла, поскольку в MX напрочь отсутствовал ассистент кода)

15 апреля 2013 в 15:14:12

Совсем нубы даже флеш открывать не умеют, зачем им знать чо такое х? Из всех кто тут кодить умеют, давно уже выше этого уровня, а кто не умеют то воообще не умеют хД

15 апреля 2013 в 13:14:31

Maldan. ЗАТРАЛЛИЛ ((9(9(99( для совсем нубов-то инструкция, вдруг спросят "А что такое Х?"

15 апреля 2013 в 08:32:51

Сколькл слов то умных ХДДД

15 апреля 2013 в 03:06:33

Такое ощущение что мои комментарии видны только у меня, и вообще

Инструкция для нубов!

Условные обозначения:
х - любое число;

Нуб помоему здесь только ты хд

14 апреля 2013 в 17:59:52

GothX, тьфу, забыл... Аж стыдно стало :(
Во флеше юзают линейный конгруэнтный метод, как и во многих ЯП

14 апреля 2013 в 17:58:13

Самый простой это тот который генерируется от системного времени

14 апреля 2013 в 17:45:16

Yura, ну, к примеру, для начала надо уяснить, что в программировании отчет начинается не с единицы, а с нуля, поэтому random(2) будет генерировать псевдослучайное число из области первых двух чисел - то есть из 0 и 1.
Кстати, всегда было интересно, а какой алгоритм используется при "генерировании" рандомом?

14 апреля 2013 в 17:39:46

Ой нет тупанул, вероятность выпада n числа в любом случае будет 1 / 2 ^ 32 так как для выпада числа n играет роль только рандом от 0 до 1 но никак не сам n, так что будь n хоть 1000 вероятность все равно будет 1 / 4294967296 что рандом выдаст нам 1000

14 апреля 2013 в 17:34:34

Random(2) есть предположения что там примерно такая формула int(rand * 2) где ранд это случайное число от 0 до 1, и умноженное на 2, то есть предположим 0.3 * 2 = 0.6 а так как инт всегда округляет в меньшую сторону мы получим 0, если умножить 0.99 * 2 = 1.98 и получим 1 то есть теоретически random(2) может вывести нам 2ку если рандом выдаст чистую еденицу, но эта вероятность равна 1 / 8589934592 в данном случае, 2 ^ 32 * n где n это максимальное число рандома, и чем оно больше тем меньше будет вероятность выпада этого числа, кстати и 0 в рандоме тоже выпадает с такой же вероятностью, поэтому в доках написано что рандом возвращает число 0 <= n < 1 потому что вероятность их выпада крайнеее малааааа!!!

14 апреля 2013 в 16:58:33

GothX, покажи, как надо, исправлю

14 апреля 2013 в 14:40:45

Почему х-1? Давайте выясним:
trace( random(2) ); // никогда не выдаст 2

При компиляции, в окне Output мы увидим 0 или 1, но в любом случае увидеть там 2 не получится.

Самое ох*етительное объяснение, которое я когда-либо видел.
- Папа, почему Земля крутится?
- Потому что если посмотреть на Землю со стороны, она крутится, в любом случае она не остановится.
- Спасибо, папочка, ты меня самый умный!!!
Обнимашки, чмафки, слезы, занавес.

12 апреля 2013 в 18:39:58

уу AS2 был вообще языком программирования? не помню стал ли AS языком программирования когда был 2-рым или уже когда 3-тьим.

12 апреля 2013 в 18:38:05

После AS3, as2 унылым и ничего не умеющим языком кажется, жаль что в as3 нельзя с байтом работать ( это жесть как напрягает.

12 апреля 2013 в 03:36:09

AS2 такой AS2

11 апреля 2013 в 14:48:35

да в ас2 по всякому извращаться можно

11 апреля 2013 в 14:29:02

var a:* = 5;
trace(a);
a = "dsdssd";
trace(a);
a = [];
a.push("dsdssdds");
trace(a);

А вот для более наглядной крутости ))

11 апреля 2013 в 14:26:15

var a:* = 5;
trace(a);
a = "dsdssd";
trace(a);

Вот запамятовал, по моему и в ас2 так же можно делать.

11 апреля 2013 в 14:22:47

Yura я что то насчет индуса не понял?? Если есть вар то должен быит тип, ты Number можешь и в AS3 использовать. А вообще есть тип войд когда не знаешь какой тип данных у тебя буит. *

11 апреля 2013 в 14:18:59

PolarisF, я просто уже к var привык хДДД

11 апреля 2013 в 13:40:22

//AS 2.0 sasay = 5; lalka = 4; trace (sasay - lalka);


Даже так можно ХД

11 апреля 2013 в 13:21:43

iDenChig, ну ты индус...
//AS 2.0 var sasay:Number = 5 var lalka:Number = 4 trace (sasay - lalka);

//AS 3.0 var sasay:int = 5 var lalka:int = 4 trace (sasay - lalka);

10 апреля 2013 в 14:11:05

Yura про типы данных не забывай ))

10 апреля 2013 в 12:02:07

Maldan, этого не сможет разве что первоклашка хД
var sasay = 5 var lalka = 4 trace (sasay - lalka);

10 апреля 2013 в 08:41:31

Dracyla, во, нашел что это у меня за страшный код такой.
Это - минимальный генератор Парка-Миллера. Слегка модифицированный.
http://program.rin.ru/razdel/html/718.html

10 апреля 2013 в 05:17:19

Слишком сложно, для начала лучше рассказать о переменных или арифметических операций, мне бы очень было интересно узнать как складывать или вычитать переменные

10 апреля 2013 в 04:33:42

в следующей статье буду рассказывать, как сгенерировать число в диапазоне от х до y и как создать генератор паролей хД а потом расскажу об Object хДД

09 апреля 2013 в 21:00:25

iDenChig,
я вроде про аппаратные не говорил ни чего

зачем так сильно мучится над этим, даже если записывать шумы моря, где камни постоянно по разному трутся, получишь много одинаковых значений


записывать шум моря - аппаратный генератор %)..

09 апреля 2013 в 20:20:52

Dracyla я вроде про аппаратные не говорил ни чего, ну это больше для "замков", мне они просто не нужны.

09 апреля 2013 в 20:18:17

iDenChig, и при чем здесь "попросить человека быстро по клавишам щелкать" - качество генератора случайных | псевдослучайных чисел трудно оценить 10 или 100 полученных значений %)..

09 апреля 2013 в 20:16:45

iDenChig, имел в виду количество тактов процессора с момента последнего запуска процессора, например:
http://www.delphisources.ru/pages/faq/base/get_processor_tacts.html

На счет аппаратных генераторов ты не прав, их используют, и они дают действительно хорошие результаты, например прибор Гряда 1М:
http://www.am-soft.ua/site/page2593.html

09 апреля 2013 в 19:40:58

Dracyla чет про количество тактов не понял? Количество тактов от определеной точки 1970 года?) или что то другое? Так же естественно что для первого числа генератора, потом через алгоритмы пропустить над. Вообще я не понимаю зачем так сильно мучится над этим, даже если записывать шумы моря, где камни постоянно по разному трутся, получишь много одинаковых значений. А для криптографии тоже страно это использовать. Да даже если человека попросить быстро по клавишам щелкать шикарного разброса мы всеравно не получим.

09 апреля 2013 в 18:59:45

iDenChig, системное время, количество тактов процессора или подобную фигню обычно используют только при получении первого числа генератора %)... дальше идут уже различные рекуррентные и конгруэнтные алгоритмы))..

Maldan, да, ты прав, существуют аппаратные генераторы, причем реально случайных, статистически независимых последовательностей :)

09 апреля 2013 в 18:56:38

sw_alex, там точка в адресе лишняя: http://vk.cc/1q3cFN

09 апреля 2013 в 18:09:31

Ну по времени самый эффективный, хотя можно рандом сделать из чего угодно что меняется, создают даже сервера которые выдают рандом по силе ветра или атмосферному давлению, чото в этом роде

09 апреля 2013 в 17:24:50

Хмм я думал всегда что все рандомы, работают на системном времени )) Просто рандом программно иначе не получить )) Вот и программеры активность проявлять стали жалко что редко ((

09 апреля 2013 в 17:01:29

Код действительно довольно стрёмный, но даёт хорошее распределение. Или как оно там называется. Сначала пробовал функцию попроще, но там рандомность была хреновая.

09 апреля 2013 в 16:59:23

Dracyla, 403 Forbidden

09 апреля 2013 в 16:35:08

Немного "по-умничаю":

1) Функции randomize, srand (и прочие) нужны, чтобы задать первое число для генерации псевдослучайной последовательности. В C++, например, обычно берется для этого текущее время, и не редко можно в сети встретить такой код:
srand((unsigned int)time(NULL));

Из чего следует, что первое число последовательности будет вычисляется от текущего времени. Как изначально берется значение (в смысле какое стоит по умолчанию) я, к сожалению, не знаю...

2) Написать свой генератор псевдослучайных чисел очень просто. Я не знаю, где взял sw_alex тот ужасный код, но для генерации можно использовать простейшую формулу, например: http://vk.cc/1q3cFN.
Подождите, пожалуйста...
Fundux.ru v.3.0 © 2006-2021 AleXNoD
Портал русских флеш игр и flash мультов