Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 04.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.73 Mб
Скачать

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]. Що стосується мов програмування загального призначення, то засоби генерування випадкових чисел, вбудовані в них, взагалі не задовольняють будь-яким статистичним критеріям. Тому їх не слід використовувати під час проведення відповідальних досліджень.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]