причому так, щоб інтервали, закріплені за різними значеннями випадкові величини не перетиналися б між собою. Оскільки сума ймовірностей всіх значень випадкова величина дорівнює 1, і такий же діапазон значень, прийнятих псевдослучайной величиною, що генерується функцією rand (), то ці підінтервали повністю покриють діапазон можливих значень, прийнятих випадкова величина, що генерується функцією rand ().
Тепер ми повинні лише щоразу визначати, до якого з безлічі обраних зазначеним вище чином підінтервалів належить чергове видане функцією rand () значення, і видавати відповідне йому значення модельованої дискретної випадкова величина.
Формально цей метод може бути представлений в наступному вигляді. Нехай - випадкова величина, рівномірно розподілена на відрізку [0,1] (У нашому випадку - це результат чергового виконання функції rand ()) і - моделируемая дискретна випадкова величина з розподілом. Тоді ми видаємо по отриманні чергового значення g випадкової величини таке значення дискретної випадкової величини, для якого вірно подвійне нерівність. Цим вичерпується рішення задачі моделювання дискретної випадкової величини із заданим розподілом. Вищенаведений алгоритм легко реалізується програмно, - наприклад так, як в нижчеподаній функції int discrete (float p []):
unsigned int discrete (float p [])
{
float s, r;
int k = 0;
s = p [0]; r = rand ();
while (s
{
k + +;
s = s + p [k];
}
return k;
}
Функція приймає масив ймовірностей модельованої дискретної випадкової величини і видає індекс чергового її згенерованого значення. Слід врахувати, що оскільки індексація масивів у мові С починається з нуля, також з нуля індексуються значення розігруваної випадкової величини. Тобто функція видає значення в діапазоні від 0 до к-1 для дискретної випадкової величини, що приймає до значень. Нижче для ілюстрації наведено ряд з 100 значень виданих програмою, що використовує виклик даної функції для масиву ймовірностей p = {0.5, 0.5}:
0 1 1 1 0 0 0 1 1 1 1 1 1 0 1 0 0 1 1 0 1 1 0 0 0 0 0 1 0 1 0 0 0
1 0 1 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0
1 0 1 0 1 1 1 0 0 1 1 0 1 0 1 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 0 0 1
1.2.6 Моделювання випадкової величини, рівномірно розподіленої в інтервалі ( a , b )
Ми використовуємо метод зворотної функції для моделювання рівномірного і показового розподілів. Вирішуємо рівняння. Для цього, підставивши вираз для щільності рівномірного розподілу на місце, спочатку обчислимо інтеграл у лівій частині рівняння:
,
а потім для обчислення значень u рівномірно розподіленим в інтервалі (a, b) випадкової величини через значення g випадкової величини, рівномірно розподіленої в інтервалі (0,1) просто висловимо змінну u через змінну ...