#include <iostream> #include <fstream> using namespace std;  char* intToBin (int decimal, int& howMuchZero, int& howMuchOne) {     int i = 0, binArray[255];   //массив, в который записываются     if (decimal != 0)           //единицы и нули         while (decimal > 0)         {             binArray[i] = decimal % 2;             decimal = decimal / 2;             i++;         }     else     {         binArray[0] = 0;         i = 1;     }     int counter = 0;     char* bin = new char [i+1];     for (counter = 0; counter <= (i-1); counter++)     {         if (binArray[counter] == 1)         {             bin[(i-1) - counter] = '1';             howMuchOne++;         }         else         {             bin[(i-1) - counter] = '0';             howMuchZero++;         }     }     bin[i] = '\0';              //последний символ - нуль-терминал     return bin;                 //возвращаем строку } void frequencyBlockTest() {     ifstream inputBin("BinSequence.txt");     ofstream outputFile("FrequencyBlockTest.txt");     char BinSequence[5000];     inputBin.getline(BinSequence, sizeof(BinSequence));      int sizeOfBlock = 0;     int sizeOfSequence = 0;      while (BinSequence[sizeOfSequence] != '\0')         sizeOfSequence++;      cout << endl << endl << "Input size of block (in bits please): ";     cin >> sizeOfBlock;     cout << endl;      int blocksQuantity = sizeOfSequence / sizeOfBlock + 1; //количество блоков      int result[blocksQuantity];     for (int l = 0; l < blocksQuantity; l++)         result[l] = 0;      int i = 0;     while (i < blocksQuantity)     {         for (int k = 0; k < sizeOfBlock; k++)         {             if (BinSequence[i * sizeOfBlock + k] == '1')                 result[i]++;         }        i++;     }      for (int i = 0; i < blocksQuantity; i++)     {         outputFile << i+1 << " block has " << result[i] << " digits one" << endl;     }      inputBin.close();     outputFile.close(); }  int main() {     int a, c, m;     int howMuchOne = 0, howMuchZero = 0;     int digit[2] = {0,0};     bool flag = true;      ofstream outputFile("sequence.txt");     ofstream outputBin("BinSequence.txt");      cout << "Input a: ";     cin >> a;     cout << "Input c: ";     cin >> c;     cout << "Input m: ";     cin >> m;     int X[m];     cout << "Input X(0): ";     cin >> X[0];      cout << X[0] << " ";     outputFile << X[0] << " ";     outputBin << intToBin(X[0], howMuchZero, howMuchOne);      for (int n = 1; (n < m) && (flag == true); n++)     {         X[n]=(a*X[n-1]+c)%m;         if (X[n] == X[0])       //проверка на конец периода         {             flag = false;       //если период закончен, то флаг в ложь                                 //и не выводим очередное число         }         else         {             bool boolFlag = false;             for (int j = sizeof(int)*8-1; j >= 0; j--)             {                 if ((X[n] & (1<<j))>>j == 1)                     boolFlag = true;                 if (boolFlag == true)                     digit[(X[n] & (1<<j))>>j]++;             }             cout << X[n] << " ";             outputFile << X[n] << " ";             outputBin << intToBin(X[n], howMuchZero, howMuchOne);         }     }      cout << endl << endl << "In the sequence we have " << howMuchZero << " zeros and ";     cout << howMuchOne << " digits one.";      float frequency = (float)howMuchOne/(float)(howMuchOne + howMuchZero);     cout << endl << endl << "Bitwise test frequency: " << howMuchOne << "/" << howMuchOne + howMuchZero << " = " << frequency;      outputBin.close();     frequencyBlockTest();      outputFile.close();      return 0; }  В результате, как и ожидалось, была сформирована последовательность из 27 чисел: 4, 18, 23, 19, 6, 11, 7, 21, 26, 22, 9, 14, 10, 24, 2, 25, 12, 17, 13, 0, 5, 1, 15, 20, 16, 3, 8.  4) Исследование ГПСЧ. Для тестирования были использованы частотный побитовый и частотный блочный тесты NIST. В листинге кода частотный побитовый тест представлен в явном виде, частотный блочный тест реализуется функцией frequencyBlockTest. В ходе формирования последовательности была получена следующая бинарная последовательность: 100100101011110011110101111110101110101011010011110101011000101100111001000111010101111111010010000111000. Всего в последовательности 105 битов, 60 из них – единицы. Таким образом, вероятность появления единицы в последовательности равна 0,5714. Данное значение близко к 1/2, что можно считать успешным прохождением побитового частотного теста. Для выполнения блочного теста были выбраны блоки по 20 бит. Вычислим количество блоков: [105/20] = 5. Шестой блок не будем принимать во внимание, как неполный. Были получены следующие значения: в первом блоке – 12 единиц; во втором блоке – 13 единиц; в третьем блоке – 11 единиц; в четвертом блоке – 11 единиц; в пятом блоке – 11 единиц. Данные значения близки к m/2 при m = 20, что свидетельствует об успешном прохождении блочного побитового теста. Стоит отметить, что например, при m = 10 или m = 25 показатели ухудшаются и дисперсия относительно m/2 сильно увеличивается. Однако при прочих m показатели можно считать хорошими.  5) Генерация СЧ с заданным законом распределения. Плотность распределения случайной величины, распределенной по экспоненциальному закону, равна  Чтобы найти алгоритм имитации экспоненциально распределенных чисел y, применим метод инверсии:  Отсюда .   Листинг кода программы:  #include <iostream> #include <fstream> #include <math.h>  using namespace std;  int main() {     float lambda;     int amount;      ofstream outputFile("outputRandom.txt");     ifstream inputFile("sequence.txt");      cout << "Input lambda: ";     cin >> lambda;     cout << "Input amount of numbers: ";     cin >> amount;      int sequence[amount];     for (int i = 0; i < amount; i++)         inputFile >> sequence[i];      double randomSequence[amount];     for (int i = 0; i < amount; i++)     {         if (sequence[i] == 0)             sequence[i] = 100;         randomSequence[i] = (double)-1/lambda * (double)(log((double)1/sequence[i]));         outputFile << randomSequence[i] << " ";     }      //Плотность вероятности     double density[amount];     for (int i = 0; i < amount; i++)     {         density[i] = (double)(lambda*exp((double)-lambda*randomSequence[i]));         outputFile << endl << density[i] << " ";     }      inputFile.close();     outputFile.close();      return 0; }