Линейный Псевдослучайный генератор чисел (PRNG)
Radu Motisan Отправленный 17-ого января 2010
Введение
Очень часто мы должны произвести случайные числа в различных целях в пределах от простых игр к алгоритмам шифрования авансов.
Много C/C ++ программисты хорошо используются с srand () / рэнд (), функции, но просто использование предопределенного кодекса, чтобы достигнуть данных задач, иногда недостаточно.
Полностью понимание, каково случайное число, как это может быть произведено, помогает получению лучшего решения.
Начинаясь с моих первых университетских лет, я использовал линейный псевдослучайный генератор, легкий осуществить, и весьма полезный во многих заявлениях.
Псевдогенератор случайных чисел (PRNG) является алгоритмом для того, чтобы произвести последовательность чисел, которая приближает свойства случайных чисел. Последовательность не действительно случайна в этом, она полностью определена относительно маленьким набором начальных ценностей, названных государством PRNG. Читайте более здесь. Read more here.
Простой подход
Давайте рассматривать a, b и c три целых числа постоянный. Мы планируем произвести ряд псевдослучайных чисел X0, X1..., Xn. Принимая X0 = d, остальная часть чисел может быть вычислена в текущем использовании формулы: Assuming X0 = d, the rest of the numbers can be computed in a recurrent using the formula:
Xn+1 = (a*Xn + b) % c.
a, b, c и d являются начальными ценностями, также известными как государство PRNG.
c ограничивает получающиеся ценности интервалом 0.. c-1
a и b затрагивают линейный угол.
Вот простой алгоритм C, чтобы лучше иллюстрировать формулу:
#include
главный int ()
{
int a=71, b=19, c=256, d = 3;int x [200], я = 0;
x [0] = d;
для (i=1; я<200;i++)
x [я] = (a*x [i-1] + b) % c;printf ("псевдо случайные числа are:\n");
для (i=0; я<200;i++)
printf ("%d", x [я]);возвратитесь 1;
}
Вы можете видеть результат в следующем изображении:

Исходный текст here:pnrg1.
Напоминать srand () и рэнд () функционирует, Вы все привыкли к, я должен выдвинуть на первый план это, они также используют PRNG. srand (), "отбирает" случайный генератор и фактически все, что делает должен установить начальные ценности (государство PRNG).
Вы можете легко приспособить генератор выше, чтобы работать как srand () и рэнд ():
#include
int = 71, b = 19, d = 0;
пустота mysrand (int семя)
{
d = семя;
}int myrand (int порог)
{
int x = d;
x = (a*x + b) порог %;
d = x;//продвигаются с каждым вызовом функции // advance with each function call
возвратите x;
}недействительное основное ()
{
mysrand (122);
printf ("Псевдослучайное число: %d\n", myrand (256));
printf ("Псевдослучайное число: %d\n", myrand (256));}
Результат как изображено ниже:

Исходный текст здесь: pnrg2
Вы быстро заметите, что PRNG производит ту же самую продукцию каждый раз, когда Вы калибруете mysrand с той же самой ценностью:
mysrand (122)-> myrand (256) =233
Но это - то же самое в случае построенного в srand () и рэнд () функция также. Причина состоит в том, что у нас нет хорошего источника для хаоса. Вы можете преодолеть это при использовании: You can overcome this by using:
mysrand (GetTickCount ());
или
mysrand (Cursorpos.x)
или
mysrand (FreeRAMMemory ())
или
mysrand (UserLastKeyPressed)
или и т.д, связывая функцию инициализации со случайным событием.
Дальнейший анализ
Говоря об уровне хаоса этого генератора, есть простой способ проанализировать последовательность чисел, в нашем случае X0..., Xn serie outputed линейным PRNG.
1. В единственном проставленном размеры месте, представленном осью действительного числа и соответствующим набором всех действительных чисел (R), данное число может быть рассмотрено как единственное юридическое лицо, соответствующее пункту на оси.
Для eg., см. следующую картину:

Это представляет несколько действительных чисел на оси. Можно было бы спросить, что является значением числа-1.13. Простой ответ:-1.13 юридическое лицо, которое сидит на оси в данном положении. Несколько свойств могут экстраполироваться, и мы получаем значение того, что-1.13, и самым важным: что может мы делать с этим. The simple answer is: -1.13 is the entity that sits on the axis at the given position. Several properties can be extrapolated, and we get a meaning of what -1.13 is, and most important: what can we do with it.
2. Для данной пары чисел мы можем изображение место bidimensional, где пара представляет пункт в Декартовской системе ссылки. Пара получает значение, и мы можем далее уточнить на этом, используя пару в различных целях. The pair receives a meaning, and we can further elaborate on that, using the pair for various purposes.
Подобным способом, для данного набора чисел (x0, x1..., xn), которые кажутся случайными и бессмысленными сначала, позволяют нам не забывать, что в месте n-dimensional, у набора чисел есть очень простое и ясное значение: это представляет пункт.
К счастью, для PRNG's вещи более просты.
Данный ряд чисел произвел с линейным PRNG, они могут быть представлены без любого значения в одном измерении: они были бы "случайными" пунктами на оси числа.
НО, мы можем искать "путь" или "значение", двигаясь в превосходящее место, в этом случае в два измерения, и представляя псевдо номера, определенные пунктом координат (Xn-1, Xn).
См. следующий образец:
1-первый образец PRNG я отправил, произвел следующие числа:
3 232 107 192 83 24 187 240 163 72 11 32 243 120 91 80 67 168.... и т.д
Очень трудно понять то, что эти числа означают или дать цель этой последовательности или даже понять образец, который служил, чтобы произвести их.
2-Позволяют нам писать простую программу, чтобы графически иллюстрировать в двух парах измерений чисел (Xn, Xn+1) как пункты в Декартовской системе.

Пункты на картине не ничто иное тогда 200 псевдо случайных чисел (3 232 107 192 83 24 187 240 163 72 11 32 243 120 91 80 67 168
171 128 147 216 251 176 227 8 75 224 51 56 155 16 131 104 235 6
4 211 152 59 112 35 200 139 160 115 248 219 208 195 40 43 0 19
88 123 48 99 136 203 96 179 184 27 144 3 232 107 192 83 24 187
240 163 72 11 32 243 120 91 80 67 168 171 128 147 216 251 176
227 8 75 224 51 56 155 16 131 104 235 64 211 152 59 112 35 200
139 160 115 248 219 208 195 40 43 0 19 88 123 48 99 136 203 9
6 179 184 27 144 3 232 107 192 83 24 187 240 163 72 11 32 243
120 91 80 67 168 171 128 147 216 251 176 227 8 75 224 51 56 155
16 131 104 235 64 211 152 59 112 35 200 139 160 115 248 219 20
8 195 40 43 0 19 88 123 48 99 136 203 96 179 184 27 144 3 232
107 192 83 24 187 240)
Интересно, что в первом казалось полным хаосом, теперь напоминает надлежащему заказу сада с деревьями, должным образом установленными в рядах и колонках, под данным углом, в нашем изображении, представленном черными точками.
Получите исходный текст здесь: pnrg3gui
Если рассмотрение последовательности в двух измерениях не показывает ничто полезное, мы можем двинуться далее и проверить представление в три измерения, пункты координат (Xn-1, Xn, Xn+1), и так далее.
Как показано выше, на одном данном уровне, "случайное" содержание получит значение.
Надежда это помогает,
Radu






