Информация

Обсуждало 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
Загружаем страницу...

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

09 апреля 2013 в 15:57:14

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

09 апреля 2013 в 15:56:36

Помню в делфи такая ботва есть, если например пишешь просто random(20); то будет получать всегда одинаковая последовательность случайных чисел, а если напаписать перед рандомом randomize(); то последовательность каждый раз разная будет.


А!?!?7!?

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

09 апреля 2013 в 14:59:31

Кстати, дерьмо а не статья.

09 апреля 2013 в 14:58:57

iDenChig, я это делал, чтобы получить последовательность случайных чисел, которая всегда одинакова. Т.к. можно задать одно стартовое число. На выходе получаем дохрена чисел, храня всего одно. Там была очень специфическая задача - ветку с листьями в БД хранить.


Помню в делфи такая ботва есть, если например пишешь просто random(20); то будет получать всегда одинаковая последовательность случайных чисел, а если напаписать перед рандомом randomize(); то последовательность каждый раз разная будет.

09 апреля 2013 в 13:35:59

iDenChig, я это делал, чтобы получить последовательность случайных чисел, которая всегда одинакова. Т.к. можно задать одно стартовое число. На выходе получаем дохрена чисел, храня всего одно. Там была очень специфическая задача - ветку с листьями в БД хранить.

09 апреля 2013 в 13:31:29

sw_alex а зачем юзать свой когда в AS3 встроен свой рандом и очень шустрый??

Просто ради интереса) Я например свой startDrag писал с закреплением в точке нажатия)

09 апреля 2013 в 13:25:55

sw_alex а зачем юзать свой когда в AS3 встроен свой рандом и очень шустрый??

09 апреля 2013 в 13:23:36

хмм я всегда делаю вот так Math.random()*num :) Хз привычка еще))

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

lol.Большое количество букаф и скриптов заставили вскипятить мне мозг..

09 апреля 2013 в 11:46:41

Аниматорам и тд. это нафиг не нужно. Программисты в курсе)

09 апреля 2013 в 11:46:02

Очень сложная задача.
Спасибо за статью! А нельзя что-ли сделать проще. Без введения новой переменной?
Не так:
trace( random(2) ); // никогда не выдаст 2

А вот так:
trace( 1+ random(2) ); // а теперь выдаст

Вот кто там про статьи говорил?
Чувствую я, что на сайте теперь появится много статей про кнопки, курсор мыши и тд.
Для кого пишешь то? Что здесь нубы что-ли такие?

09 апреля 2013 в 10:35:03

Ну и вот нарыл код самого генератора! И даже пытался его использовать.

package { public class MyRandom { const IA:int = 16807; const IM:int = 2147483647; const AM:Number = 1/2147483647; const IQ:int = 12773; const IR:int = 2836; const NTAB:int = 32; const NWUP:int = 8; const NDIV:Number = (1+(IM-1)/NTAB); const EPS:Number = 1.2e-7; const RNMX:Number = (1.0-EPS); var dummy:Number; // constructor code public function MyRandom() { } // Задать стартовое значение public function setStart(i:Number) { dummy = i; } // Взять следующее значение public function getNext():Number { var j:int; var k:int; var iy:int = 0 var iv:Array = new Array(); var temp:Number; /* initialize */ if(dummy<=0 || !iy) { /* avoid negative or zero seed */ if(dummy<0) dummy=-dummy else if(dummy==0) dummy=1; /* after NWUP warmups, initialize shuffle table */ for(j=NTAB+NWUP-1;j>=0;j--) { k=dummy/IQ; dummy=IA*(dummy-k*IQ)-IR*k; if(dummy<0) dummy+=IM; if(j<NTAB) iv[j]=dummy; } /* first specimen from the table */ iy=iv[0]; } /* regular work: generate new number */ k=dummy/IQ; dummy=IA*(dummy-k*IQ)-IR*k; if(dummy<0) dummy+=IM; /* shuffle output */ j=iy/NDIV; iy=iv[j];iv[j]=dummy; /* return */ var ret:Number; if((temp=AM*iy)>RNMX) ret=RNMX; else ret=temp; while (ret>0.1) ret-=0.1; return ret*10; } } }


Не я его придумал, я нарыл его где-то в инете.

09 апреля 2013 в 10:33:07

Для AS3 будет тот же x = Math.random(); . Выдаст число с плавающей точкой от 0 до 1.
Для округления можно использовать int(x) но он округляет всегда в меньшую сторону, просто отрезает дробную часть. Если надо по-другому - используй Math.round() - округляет число как положено (2.1 -> 2, 2.9 -> 3), Math.floor() - в меньшую сторону (5.8 -> 5), Math.ceil() - в большую (2.1 -> 3).

09 апреля 2013 в 10:23:00

Название у статьи неправильное. Тут не рассказывается, как написать сам генератор случайных чисел. Тут показано только, как сгенерировать случайное число, используя встроенные функции.
Подождите, пожалуйста...
Fundux.ru v.3.0 © 2006-2021 AleXNoD
Портал русских флеш игр и flash мультов