Untitled
unknown
plain_text
7 months ago
2.5 kB
2
Indexable
Never
#define PROFILE_CONCAT_INTERNAL(X, Y) X ## Y #define PROFILE_CONCAT(X, Y) PROFILE_CONCAT_INTERNAL(X, Y) #define UNIQUE_VAR_NAME_PROFILE PROFILE_CONCAT(profile_guard_, __LINE__) #define LOG_DURATION(x) LogDuration UNIQUE_VAR_NAME_PROFILE(x) #include <chrono> #include <cstdlib> #include <iostream> #include <vector> #include "log_duration.h" using namespace std; vector<int> ReverseVector(const vector<int>& source_vector) { vector<int> res; for (int i : source_vector) { res.insert(res.begin(), i); } return res; } int CountPops(const vector<int>& source_vector, int begin, int end) { int res = 0; for (int i = begin; i < end; ++i) { if (source_vector[i]) { ++res; } } return res; } void AppendRandom(vector<int>& v, int n) { for (int i = 0; i < n; ++i) { // получаем случайное число с помощью функции rand. // с помощью (rand() % 2) получим целое число в диапазоне 0..1. // в C++ имеются более современные генераторы случайных чисел, // но в данном уроке не будем их касаться v.push_back(rand() % 2); } } void Operate() { LOG_DURATION("Total"s); vector<int> random_bits; // операция << для целых чисел это сдвиг всех бит в двоичной // записи числа. Запишем с её помощью число 2 в степени 17 (131072) static const int N = 1 << 17; { LOG_DURATION("Append random"s); // заполним вектор случайными числами 0 и 1 AppendRandom(random_bits, N); } // перевернём вектор задом наперёд vector<int> reversed_bits; { LOG_DURATION("Reverse"s); reversed_bits = ReverseVector(random_bits); } { LOG_DURATION("Counting"s); // посчитаем процент единиц на начальных отрезках вектора for (int i = 1, step = 1; i <= N; i += step, step *= 2) { double rate = CountPops(reversed_bits, 0, i) * 100. / i; cout << "After "s << i << " bits we found "s << rate << "% pops"s << endl; } } } int main() { Operate(); }
Leave a Comment