Запрограммировать генератор псевдослучайных чисел, используя конгруэнтный метод формирования псевдослучайных чисел.
Случайные числа — возможные значения 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
мой простенький вариант
#include <iostream> #include <iomanip> using namespace std; int main() { unsigned int X = 0; //начальное значение (0<=X<m) unsigned int A = 0; //множитель (0<=a<m) unsigned int C = 0; //приращение (0<=c<m) unsigned int M = 0; //модуль(натуральное число, относительно которовы вычисляется остатокот деления, m>=2 unsigned int iCount = 0; //необходимое колличество псевдослучайных чисел int nextNumber = 1; float x = 1; cout << "\t\tКонгруэнтный метод формирования псевдослучайных чисел\n"; cout << "Введите необходимые данные:\n"; cout << "Введите значение для M - модуля, где M > 2: "; cin >> M; cout << "Введите начальное значение для X, где (0<=X<m): "; cin >> X; cout << "Введите множитель A, где (0<=A<m): "; cin >> A; cout << "Введите приращение C, где (0<=C<m): "; cin >> C; cout << "Введите какое кол-во псевдосулчайных чисел необходимо: "; cin >> iCount; nextNumber = (A * X + C) % M; for(int i = 0; i < iCount; i++) { nextNumber = (A * nextNumber + C) %M; x = (float)nextNumber/M; cout << fixed << setprecision(2) << x << " "; } return 0; }colt
Задание не совсем корректное, т.к. сумма «a(i)» не зависит от «n» и, следовательно, всегда является константой. Вместо этого, я в своей программе использовал функцию «double dGet_A(int iNumber)». Результат с теми же коэффициентами, что и в примере решения получился таким:
#include "stdafx.h" #include "iostream" #include "iomanip" #include "windows.h" #include "math.h" using namespace std; #define MAX 100.0 double dX; double dGet_A(int iNumber) { iNumber%=10; double dA[]={1.1, 5.2, 9.3, 4.4, 3.5, 7.6, 0.7, 2.8, 8.9, 6.0}; return dA[iNumber]; } int _tmain(int argc, _TCHAR* argv[]) { SetConsoleCP(1251); SetConsoleOutputCP(1251); cout.flags(ios::fixed); while(true) { system("CLS"); double dY_Prev=2.0, dY_Next=0.0, dA=8.0, dMu=65.0; int iNumberOfNumbers=25; cout<<"Псевдослучайные числа: "; for (int i=0;i<iNumberOfNumbers;i++) { dY_Next=fmod((dGet_A(i)*dY_Prev+dMu),MAX); dX=dY_Next/MAX; cout<<setprecision(3)<<dX<<" "; dY_Prev=dY_Next; } cout<<"\n\n"; system("PAUSE"); } return 0; }