Запрограммировать генератор псевдослучайных чисел, используя конгруэнтный метод формирования псевдослучайных чисел.
Случайные числа — возможные значения xi
, непрерывной случайной величины X
, распределённой равномерно на интервале [0;1)
.
Формулы определяющие конгруэнтный метод генерации псевдослучайных чисел:
где, a0, a1, . . . , aj
— множители
µ
— значение инкремента
y1, y2, . . . , yn
— получаемые случайные числа
x1, x2, . . . , xn
— случайные числа на интервале [0;1)
Программа сгенерировала 15 псевдослучайных чисел, результат работы программы смотрим ниже. Все случайные числа находятся в интервале [0;1)
.
// linear_congruential.cpp: определяет точку входа для консольного приложения. //линейный конгруэнтный метод генерации псевдослучайных чисел #include "stdafx.h" #include <iostream> using namespace std; double congruential(int &); // прототип функции генерации псевдослучайных чисел int main(int argc, char* argv[]) { const int number_numbers = 25; // количество псевдослучайных чисел int x0 = 2; // начальное значение (выбирается случайно 0 <= x0 < m) cout << "\npseudo-random numbers: "; for (int i = 0; i <= number_numbers; i++) cout << congruential(x0) << " "; // генерация i-го числа cout << "\n"; system("pause"); return 0; } double congruential(int &x) // функция генерации псевдослучайных чисел { const int m = 100, // генерация псевдослучайных чисел в диапазоне значений от 0 до 100 (выбирается случайно m > 0) a = 8, // множитель (выбирается случайно 0 <= a <= m) inc = 65; // инкрементирующее значение (выбирается случайно 0 <= inc <= m) x = ((a * x) + inc) % m; // формула линейного конгруэнтного метода генерации псевдослучайных чисел return (x / double(m)); }
А вот и сгенерированные числа:
CppStudio.com
pseudo-random numbers: 0.81 0.13 0.69 0.17 0.01 0.73 0.49 0.57 0.21 0.33 0.29 0.97 0.41 0.93 0.09 0.37 0.61 0.53 0.89 0.77 0.81 0.13 0.69 0.17 0.01 0.73
Комментарии
odto11
мой простенький вариант
colt
Задание не совсем корректное, т.к. сумма «a(i)» не зависит от «n» и, следовательно, всегда является константой. Вместо этого, я в своей программе использовал функцию «double dGet_A(int iNumber)». Результат с теми же коэффициентами, что и в примере решения получился таким: