Если производительность ваш единственный критерий, то answer является:
bool get_random()
{
return true; // chosen by fair coin flip.
// guaranteed to be random.
}
К сожалению, энтропия этого случайного числа равна нулю, но производительность довольно быстро.
Поскольку я подозреваю, что этот генератор случайных чисел не очень полезен для вас, вам необходимо определить , насколько случайным вы хотите, чтобы ваши булевы были. Как насчет длины цикла 2048? Один миллион? 2^19937-1? До конца Вселенной?
Я подозреваю, что, поскольку вы прямо заявили, что производительность является вашей главной заботой, тогда хороший старомодный линейный конгруэнтный генератор может быть «достаточно хорошим». Основываясь на this article, я предполагаю, что период этого генератора составляет около 32 * ((2^31) -5) или около 68 триллионов итераций. Если это не «достаточно хорошо», вы можете добавить любой генератор, совместимый с C++ 11, который вам нравится вместо minstd_rand.
Для дополнительного кредита и небольшого удара производительности, используйте приведенный ниже код, чтобы использовать biased coin algorithm, чтобы удалить предубеждение в генераторе.
#include <iostream>
#include <random>
bool get_random()
{
typedef std::minstd_rand generator_type;
typedef generator_type::result_type result_type;
static generator_type generator;
static unsigned int bits_remaining = 0;
static result_type random_bits;
if (bits_remaining == 0)
{
random_bits = generator();
bits_remaining = sizeof(result_type) * CHAR_BIT - 1;
}
return ((random_bits & (1 << bits_remaining--)) != 0);
}
int main()
{
for (unsigned int i = 0; i < 1000; i++)
{
std::cout << " Choice " << i << ": ";
if (get_random())
std::cout << "true";
else
std::cout << "false";
std::cout << std::endl;
}
}
'std :: bernoulli_distribution' медленно от моего опыта. Лучший способ - генерировать 'unsigned long long' (для x64) и использовать его биты в виде логических значений. – Vitaliy
Зачем вам нужна статика? – juanchopanza
Сколько «случайности» вам нужно? В конце концов, вы можете просто объявить uninitialised int и вернуть свой первый бит. Значение будет «случайным», но с неизвестным распределением. –