
- •Імовірнісне моделювання
- •4.1. Метод статистичних випробувань
- •4.2. Генератори випадкових чисел
- •4.2.1. Типи генераторів
- •4.2.2. Лінійні конгруентні генератори
- •4.3. Перевірка послідовностей випадкових чисел
- •4.4. Моделювання випадкових подій та дискретних величин
- •4.4.1. Незалежні випадкові події
- •4.4.2. Група несумісних подій
- •4.4.3. Умовна подія
- •4.4.4. Випадкова дискретна величина
- •4.4.5. Геометричний розподіл
- •4.4.6. Біноміальний розподіл
- •4.4.7. Розподіл Пуассона
- •4.5. Моделювання неперервних випадкових величин
- •4.5.1. Метод оберненої функції
- •4.5.2. Рівномірний розподіл
- •4.5.3. Експоненціальний розподіл
- •4.5.4. Пуассонівський потік
- •4.5.5. Нормальний розподіл
- •4.5.6. Логарифмічно-нормальний розподіл
- •4.5.7. Розподіл і потоки Ерланга
- •4.5.8. Гамма-розподіл
- •4.5.9. Бета-розподіл
- •4.5.10. Розподіл Вейбулла
- •4.5.11. Гіпер- і гіпоекспоненціальні розподіли
- •4.6. Моделювання випадкових векторів
- •4.7. Моделювання випадкових процесів
- •4.8. Статистична обробка результатів моделювання
- •4.8.1. Оцінювання ймовірності
- •4.8.2. Оцінювання розподілу випадкової величини
- •4.8.3. Оцінювання математичного сподівання
- •4.8.4. Оцінювання дисперсії
- •4.8.5. Оцінювання кореляційного моменту
- •4.9. Визначення кількості реалізацій під час моделювання випадкових величин
- •4.9.1. Оцінювання ймовірності
- •4.9.2. Оцінювання середнього значення
- •Висновки
- •Контрольні запитання та завдання
- •Рождение метода Монте-Карло в Лос-Аламосе
- •Дальнейшее развитие и современность
- •Интегрирование методом Монте-Карло
- •Обычный алгоритм Монте-Карло интегрирования
- •Геометрический алгоритм Монте-Карло интегрирования
- •Квантовый метод Монте-Карло
- •Детерминированные гпсч
- •Гпсч с источником энтропии или гсч
- •Пример простейшего гсч с источником энтропии
- •Примеры гсч и источников энтропии
- •Гпсч в криптографии
- •Примеры криптостойких гпсч Циклическое шифрование
- •Аппаратные гпсч
- •Теоретическая основа Принципы построения
- •Графические тесты
- •Статистические тесты
- •Тесты diehard
- •Тесты д. Кнута
- •Тесты nist
- •Практические приложения
- •Конкурс aes
- •Свойства примитивных многочленов
- •Свойства
- •Линейная сложность
- •Корреляционная независимость
- •Алгоритмы генерации примитивных многочленов Готовые таблицы
- •КонфигурацияГалуа
- •Примеры генераторов Генераторы «стоп-пошёл»
- •Каскад Голлманна
- •Пороговый генератор
- •Другие виды Самопрореживающие
- •Многоскоростной генератор с внутренним произведением
- •[Править]Преимущества
- •[Править]Недостатки
- •Моменты
- •Свойства гамма-распределения
- •Связь с другими распределениями
- •Моделирование гамма-величин
- •Определение
- •Форма графика
- •Моменты
- •Связь с другими распределениями
- •Распределение Вейбулла
- •Свойства гиперэкспоненциального распределения
- •Моделирование марковских случайных процессов
- •Марковский процесс с дискретным временем
- •Марковские случайные процессы с непрерывным временем
- •Цепь Маркова
- •Цепь Маркова с дискретным временем Определение
- •Переходная матрица и однородные цепи
- •Граф переходов, связность и эргодические цепи Маркова
- •Примеры
- •Основное кинетическое уравнение
- •Функции Ляпунова для основного кинетического уравнения
- •Примеры функций Моримото
4.2.2. Лінійні конгруентні генератори
Зважаючи на ці вади, на практиці використовують більш складні програмні генератори. У більшості сучасних програмних генераторів використовується властивість конгруентності, яка полягає в тому, що два цілих числа А і В є конгруентними за модулем m, якщо їх різниця (А – В) є числом, яке ділиться на m без остачі (тобто є кратним m). Записується це так:
Наприклад, щоб знайти число, конгруентне з числом 134 за модулем 10, необхідно знайти цілочислову остачу від ділення 134 на 10, яка дорівнює 4.
Наведемо кілька прикладів обчислення конгруентних значень для різних m:
12 5 (mod 7); 35 5 (mod 10); 125 5 (mod 10).
Серед методів генерування випадкових чисел найбільш поширеним є лінійний мультиплікативний конгруентний метод:
|
(4.1) |
де і = 1, 2, ...; а, с і m — цілі константи.
Щоб отримати нове число, необхідно взяти псевдовипадкове число хi (або задати вихідне х0), помножити його на коефіцієнт а, додати константу с і взяти модуль отриманого числа за m, тобто розділити на m, і отримати остачу. Ця остача і буде наступним псевдовипадковим числом хi+1. У разі правильного підбору параметрів цей генератор повертає випадкові числа від 0 до m – 1.
Отримані
за формулою (4.1) значення хi+1
належать до діапазону
і мають рівномірний дискретний розподіл.
Для того щоб отримати випадкове значення
rі+1
з інтервалу [0, 1], необхідно число хi+1
розділити на m.
У цьому разі всі значення m,
с,
a,
x0
повинні бути додатними й задовольняти
умовам:
Отримана за формулою (4.1) послідовність називається лінійною конгруентною послідовністю.
Однією із вад лінійних конгруентних генераторів є те, що отримані випадкові числа хі+1 суттєво залежать від значень m, с, a, x0 і обчислюються за однією й тією ж формулою (4.1), тобто не є абсолютно випадковими. Але незважаючи на те що алгоритм їх отримання є детермінованим, за умови відповідного вибору констант m, с, a послідовність чисел хі+1, на основі яких отримують значення rі+1, повністю задовольнятиме більшості статистичних критеріїв.
Ще
одна вада цих генераторів стосується
того, що випадкові числа rі+1,
отримані за допомогою генератора, можуть
приймати тільки дробово-раціональні
значення —
.
Більше того, числа rі+1
можуть приймати лише деякі з указаних
значень залежно від вибраних параметрів
m,
с,
a,
x0,
а також від того, як реалізується операція
ділення чисел з плаваючою комою на число
m
у комп'ютері, тобто залежно від типу
комп'ютера і системи програмування.
Наприклад, якщо m
= 10, x0
= а
= с
= 7, то отримаємо послідовність 7; 6; 9; 0;
7; 6; 9; 0,..., яка не є випадковою. Це свідчить
про важливість правильного вибору
значень констант m,
с,
a,
x0.
Правильно підібрані значення іноді
називають магічними
числами.
Наведений приклад ілюструє й те, що конгруентна послідовність завжди є циклічною, тобто вона починає повторюватися через певну кількість випадкових чисел. Кількість значень, після яких випадкові числа починають повторюватися, називається повним періодом генератора і є основним його параметром. Значення повного періоду залежать від розрядності комп'ютера, а також від значень m, с, a, x0. Існує теорема, яка визначає умови існування повного періоду генератора, а саме:
числа с і m повинні бути взаємно простими, тобто мати взаємний дільник 1;
значення b = а – 1 має бути кратним q для кожного простого q, бути дільником m;
значення b має бути кратним 4, якщо m кратне 4.
Достатність цих умов уперше було доведено Халлом і Добеллом. Повне доведення теореми можна знайти в літературі [23].
Якщо с > 0, то генератор називається мішаним, а якщо с = 0 — мультиплікативним.
Розглянемо, як потрібно вибирати параметри лінійного конгруентного генератора, щоб отримати послідовність з повним періодом. Для отримання такої послідовності необхідно вибирати значення m = 2g – 1, де g — довжина розрядної сітки комп'ютера. Для 32-розрядного комп'ютера m — найбільше ціле число, яке може бути відтворене в ньому, дане число дорівнює 231 – 1 = 2147483647 (один розряд відводиться під знак числа). У цьому разі ділення хі+1/m виконувати не обов'язково. Якщо в результаті роботи генератора буде отримане число хі+1, яке більше ніж те, що може бути відтворене в комп'ютері, виникне переповнення розрядної сітки. Це призведе до втрати крайніх лівих двійкових знаків цілого числа, які перевищили допустимий розмір. Однак розряди, що залишились, саме і є значеннями хі+1 (mod 2g). Таким чином, під час генерування замість операції ділення можна скористатись переповненням розрядної сітки.
Стосовно константи с теорема стверджує, що для отримання послідовності з повним періодом генератора значення с повинне бути непарним, і, крім того, а – 1 має ділитися на 4. Для такого генератора початкове значення х0 може бути довільним і лежати в діапазоні від 0 до m – 1. Якщо с = 0, то отримуємо мультиплікативний конгруентний метод, який передбачає використання таких рекурентних виразів:
|
(4.2) |
Цей метод більш швидкодіючий, ніж попередній, але він не дає послідовності з повним періодом. Дійсно, з виразу (4.2) видно, що значення хі+1 = 0 може з'явитись тільки в тому випадку, якщо послідовність вироджується в нуль. Взагалі, якщо d — будь-який дільник m і хі кратне d, всі наступні елементи мультиплікативної послідовності хі+1, хі+2, ... будуть кратними d. Таким чином, якщо с = 0, потрібно, щоб хі і m були взаємно простими числами з m і знаходились між 0 і m.
Що стосується вибору а, то у випадку, коли m = 2g, де g 4, викладені в праці [23] умови приводять до єдиної вимоги стосовно значення а:
а = 3 (mod 8) або а = 5 (mod 8).
У цьому випадку четверта частина всіх можливих значень множників дає довжину періоду, що дорівнює m/4, яка й буде максимальним періодом генератора.
Наведемо одну з найкращих програм генерування послідовностей рівномірно розподілених випадкових чисел.
/* Програма мовою С для ТТ800: версія від 8 липня 1996 р. */
/* М. Matsumoto, email: matumoto@math.keio.ac.jp */
/* genrand() генерує одне псевдовипадкове число */
/* з подвійною точністю */
/* рівномірно розподілене в інтервалі [0, 1] */
/* для кожного запиту. Можна вибирати будь-які */
/* 25 початкових значень */
/* окрім всіх нулів. */
/* Див.: ACM Transactions on Modelling and Computer Simulation. */ /* Vol. 4. No. 3. 1994. pages 254-266. */
#include
#define N 25
#defіne M 7
double
genrand()
{
unsigned long y:
static int k = 0;
static unsigned long x[N]={/* Початкові 25 значень за бажанням */
0x95f24dab. 0х0b685215. 0хе76ссае7. 0xaf3ec239. 0x715fad23.
0x24a590ad. 0x69e4b5ef. 0xbf456141. 0x96bc1b7b. 0xa7bdf825.
0xclde75b7. 0x8858a9c9. 0x2da87693. 0xb657f9dd. 0xffdc8a9f.
0x8121da71. 0x8b823ecb. 0x885d05f5. 0x4e20cd47. 0x5a9ad5d9.
0x512c0c03. 0xea857ccd. 0x4cc1d30f. 0x8891a8a1. 0xa6b7aadb.
};
static unsigned long mag01[2]={
0x0. 0x8ebfd028 /* Це чарівний вектор 'а', що не змінюється*/
};
if (k==N) { /* Генерування N слів одночасно */
int kk;
for (kk=0:kk> 1) ^ mag01[x[kk] % 2];
}
for (: kk> 1) ^ mag01[x[kk] % 2];
}
k=0;
}
у = x[k];
У ^= (у << 7) & 0х2b5b2500; /* s і b. чарівні вектори*/
у ^= (у << 15) & 0xdb8b0000: /* t і с. чарівні вектори */
у &= 0xffffffff: /* вилучіть цей рядок, якщо довжина слова = 32 */
/* Наступний рядок був доданий для зменшення кореляції. */
у ^= (у >> 16); /* Додати для версії 1994 р. */
k++;
return( (double) у / (unsigned long) 0xffffffff);
}
/* main() виводить перші 50 згенерованих чисел */
main()
{ int j;
for (j=0; j<50; j++) {
printf("%5f ". genrand());
if (j%8==7) printf("\n");
}
print("\n");
}
Існують й інші конгруентні методи генерування випадкових чисел, серед яких слід відзначити адитивний.
Найпростіший генератор, послідовність якого хі+1 залежить більше ніж від одного з попередніх значень, — це генератор, що використовує числа Фібоначчі:
Цей генератор широко використовувався в 50-ті роки XX століття, але, як показали подальші дослідження, статистичні властивості його досить низькі. Більш складні методи генерування випадкових чисел можна знайти в праці [23].
Розглянуті в цьому розділі методи генерування випадкових чисел не стосуються дослідників, які використовують мови або пакети моделювання. Ці засоби містять вбудовані генератори випадкових чисел, якість яких залежить від розробників цих програмних засобів. На жаль, є ще багато пакетів моделювання, в яких застосовуються генератори досить низької якості [18]. Що стосується мов програмування загального призначення, то засоби генерування випадкових чисел, вбудовані в них, взагалі не задовольняють будь-яким статистичним критеріям. Тому їх не слід використовувати під час проведення відповідальних досліджень.