Что-то вдруг захотелось посмотреть, как работает функция 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 отличия будут большие(в среднем конечно) и получится примерно та же картинка.
Комментариев нет:
Отправить комментарий