daily pastebin goal
32%
SHARE
TWEET

Untitled

a guest May 16th, 2018 90 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. п»ї#include <iostream>
  2. #include <fstream>
  3. #include <bitset>
  4. #include <string>
  5. #include <cmath>
  6. using namespace std;
  7. int lcg(int m = 0, int a = 0, int c = 0, int x = 0){
  8.     static int M = m; // Статические инты для того, чтобы не посылать их в функцию каждый раз. Так они просто сохраняются после первого определения (72-ая строка)
  9.     static int A = a;
  10.     static int C = c;
  11.     static int X = x;
  12.     X = (A*X+C) % M; // Формула, по которой высчитывается следующий псевдорандомный элемент. Зависит от коэффициетнот a, c, m и от прошлого x.
  13.     return X; // Возвращает новый псевдорандомный элемент
  14. }
  15. void distribution(int* arr_ran, int N, int m){
  16.     // Нужно было как-то заисать данные в 2 столбика. Я придумал такой вариант, но каждый раз когда я открываю эту лабу, я уже не помню как именно я здесь это осуществил. Я к тому, что можно сказать, что после выполнения какой-то задачи я успешно забыл о том как я это сделал, как о чем-то уже ненужном
  17.     ofstream out("data.txt");
  18.     int size = 10; // Сколько коллонок в гистограмме
  19.     int* distr = new int[size];
  20.     distr[0]=m/(size); //=10
  21.     for (int i=1; i<size; i++){ // Здесь создается массив чисел с шагом m/size, в данном случае 10.
  22.         distr[i]=distr[i-1]+m/(size);
  23.     }
  24.     int* tmp = new int[size];
  25.     for (int i = 0;i<size; i++) tmp[i]=0;
  26.     for (int i=0; i<N; i++){
  27.         for (int j=0; j<size; j++){
  28.             if (arr_ran[i]<distr[j]){ //Сверяется каждый элемент последовательности с каждым шаком в гистограмме
  29.                 tmp[j]++;
  30.                 break;
  31.             }
  32.         }
  33.     }
  34.     int middle=m/size/2;
  35.     for (int i=0; i<size; i++){
  36.         out << distr[i]-middle << "\t" << tmp[i] << endl; // Для гистограммы нужно указать именно среднее значение по иксам.
  37.     }
  38. }
  39. void test(int* arr_ran, int N){
  40.     const int bits=8; // Кол-во бит для представления
  41.     int Sum=0;
  42.     for (int i=0; i<N; i++){
  43.         bitset<bits> b{(arr_ran[i])};
  44.         for (int i=bits-1; i>=0; i--){ //Здесь подсчитывается S n по всей последовательности
  45.             Sum+=2*b[i]-1;
  46.         }  
  47.         cout << b.to_string() << endl; // to_string переводит массив битов в сроковое представление
  48.     }
  49.     double Sum_obs = abs(Sum)/sqrt(N*bits); //S obs считает по формуле
  50.     double P = erfc(Sum_obs/sqrt(2)); // erfc - функция ошибок, присутвует в библиотеке cmath C++
  51.     cout << "P = " << P;
  52.     if (P>0.01) cout << " Success" << endl;
  53.     else
  54.     {
  55.         cout << " Failed" << endl;
  56.     }
  57. }
  58.  
  59. int main() {
  60.     int N, a, c, x;
  61.     int m;
  62.    
  63.     cout << "Linear Congruent Generator" << endl;
  64.     cout << "Enter number of digits N, modulus m, multiplier a, increment c, start value X: " << endl;
  65.     //cin >> N >> m >> a >> c >> x;
  66.  
  67.     N=100;
  68.     m=100; // Будут генериться разные числа от 0 до 99 включительно.
  69.     x=1;
  70.     a=21; // 100 делится на такие простые числа: 2, 5. a=их произведению +1 = 11. Но так как если m нацело делится на 4, а a-1 следовательно тоже должно делится на 4, то умножаем 2*5*2 и только тогда +1.
  71.     c=3; // У c и m не должно быть общих делителей
  72.     // Попробуй изменить a на 20, или c на 4 например. (последовательность начнет повторятся до того, как в ней наберется m чисел).
  73.  
  74.     int* arr_ran = new int[N];
  75.     lcg(m,a,c,x);
  76.     for (int i=0; i<N; i++){
  77.         int get_ran = lcg();
  78.         cout << get_ran << " ";
  79.         arr_ran[i]=get_ran;
  80.     }
  81.     cout << endl << endl;  
  82.     distribution(arr_ran, N, m);
  83.     test(arr_ran, N);
  84.     system("pause");
  85. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top