Линейный конгруэнтный генератор Лемера 1951
Наиболее популярным для получения псевдослучайных чисел является
метод вычетов по формуле:
U[i+1] = (U[i]*M)mod p = U[i]*M-p*int(U[i]*M/p)
R[i]=U[i]/p,где U[i],M,p-целые числа,0<R[i]<1,1<=U[i]<=p-1.
И само задание:
Исследовать при каких U[0],p,M длина последовательности неповторяющихся чисел будет не менее 10000, при «хороших» стохастических параметрах. Определить влияет ли величина R[0],при M и p=const на статические характеристики датчика. Если влияет, то определить область допустимых величин U[0]. Представить результаты тестирования генератора для оптимальных величин p,M,U[0].
Сообственно буду добавлять сейчас код потихоньку и нужно сделать сами числа R в интеревале от [0,1].
#include <iostream>
#include <vector>
const int M = 302;
const int p = 1003;
const float U0 = 0.5;
const int N = 10000;
std::vector<float> gen(float R0, int m, int p)
{
std::vector<float> R;
std::vector<float> U;
U.push_back(R0);
for (int i = 0; i < N; i++)
{
U.push_back(U.back()/*U[i]*/ * M - p*int(U.back()/*U[i]*/ * M / p));
float r_ = U[i] / p;
R.push_back(r_);
std::cout <<R.back()<<" ";
}
return R;
}
int main()
{
gen(U0,M,p);
std::cin.ignore();
return 0;
}