Что-то вдруг захотелось посмотреть, как работает функция rand() в C++. Не алгоритм генерации, а распределение результатов. Ну и забавы ради посмотрел что получилось.
Результаты получились довольной скучные - распределение примерно равномерное. Как проводились тесты - создаётся массив, зануляется, затем 10000000 прибавляется единица к случайному элементу массива, ну и затем выводится относительная частота. Объяснение немного странное, поэтому в конце поста есть код программы.
Результаты получились довольной скучные - распределение примерно равномерное. Как проводились тесты - создаётся массив, зануляется, затем 10000000 прибавляется единица к случайному элементу массива, ну и затем выводится относительная частота. Объяснение немного странное, поэтому в конце поста есть код программы.
- Без перемешивания, 32768 элементов.
- Перемешивание в начале генерации послеовательности, 32768 элементов
Под перемешиванием я имею ввиду функцию srand
Первые 100 элементов из этой последовательности:
Вообще на самом деле не лучшая идея, т.к. по сути каждый раз генератор сбрасывается. Зато получается хоть какая-то оригинальная картинка.Первые 100 элементов из этой последовательности:
Код программы(для последнего случая):
Для тестирования использовалась Visual Studio 2008 с её компилятором. Не думаю, что на gcc отличия будут большие(в среднем конечно) и получится примерно та же картинка.
#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 отличия будут большие(в среднем конечно) и получится примерно та же картинка.





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