Advertisement
Guest User

Untitled

a guest
May 16th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.53 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement