Конгруэнтный метод формирования псевдослучайных чисел

Уровень сложности:

Запрограммировать генератор псевдослучайных чисел, используя конгруэнтный метод формирования псевдослучайных чисел.

Случайные числа — возможные значения 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
Следующие статьи помогут вам в решении данной задачи:
Автор: admin
Дата: 11.09.2012
Поделиться:

Комментарии

  1. odto11

    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;
    }
  2. colt

    Задание не совсем корректное, т.к. сумма «a(i)» не зависит от « и, следовательно, всегда является константой. Вместо этого, я в своей программе использовал  функцию «double dGet_A(int iNumber)». Результат с теми же коэффициентами, что и в примере решения получился таким:

     Псевдослучайные числа: 0.672 0.144 0.993 0.019 0.716 0.091 0.714 0.649 0.427 0.210 0.881 0.230 0.788 0.116 0.057 0.087 0.711 0.641 0.351 0.754 0.479 0.140 0.956 0.857 0.650

    #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;
    }

     

     

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.