понедельник, 21 января 2013 г.

Стандартный random C++

Что-то вдруг захотелось посмотреть, как работает функция rand() в C++. Не алгоритм генерации, а распределение результатов. Ну и забавы ради посмотрел что получилось.
Результаты получились довольной скучные - распределение примерно равномерное. Как проводились тесты - создаётся массив, зануляется, затем 10000000 прибавляется единица к случайному элементу массива, ну и затем выводится относительная частота. Объяснение немного странное, поэтому в конце поста есть код программы.
  1. Без перемешивания, 32768 элементов.
  2.  
     Под перемешиванием я имею ввиду функцию srand


     Первые 100 элементов из этой последовательности:









  3. Перемешивание в начале генерации послеовательности, 32768 элементов
  4.  
     Аналогично первые 100:








  5. Перемешивание перед генерацией каждого числа, 256 элементов
  6.  Вообще на самом деле не лучшая идея, т.к. по сути каждый раз генератор сбрасывается. Зато получается хоть какая-то оригинальная картинка.

Код программы(для последнего случая):
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <sstream>
#include <time.h>

using namespace std;

string convertInt(int number){
   stringstream ss;
   ss << number;
   return ss.str();
}

int main(){
 string f_n;
 FILE* outp;
 unsigned long int *mas = new unsigned long int [32769];
 int rand_N = 10000000;
 
 for(int n = 2; n < 32769; n *= 2){

  for(int i = 0; i < n; i++)
   mas[i] = 0;

  f_n = convertInt(n);
  f_n = f_n + "_tsr.txt";

  outp = fopen(f_n.c_str(), "w");
  for(int i = 0; i < rand_N; i++){
   mas[rand()%n]++;
   srand(time(0));
  }

  for(int i = 0; i < n; i++)
   fprintf(outp, "%d\t%f\n", i, 1.0*mas[i]/rand_N);
  fclose(outp);
 }
 return 0;
}

Для тестирования использовалась Visual Studio 2008 с её компилятором. Не думаю, что на gcc отличия будут большие(в среднем конечно) и получится примерно та же картинка.

Комментариев нет:

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