Какова наиболее случайная функция в C++? [закрытый]

Это потому, что вы храните указатель на копию вашего объекта:

void Game::addPlayer(Player A)

Вам нужно использовать ссылку и сохранить ее:

void Game::addPlayer(Player& A)

В противном случае вы получите неопределенное поведение.

5
задан 4 May 2009 в 23:11
поделиться

9 ответов

The rand() and srand() functions are all the C++ Standard specifies. And if it comes to writing your own, be aware of what John von Neumann said:

"Anyone who considers arithmetical methods of producing random digits is конечно, в состоянии греха "

14
ответ дан 18 December 2019 в 05:15
поделиться
  • Библиотека ускорения случайных чисел предлагает широкий спектр генераторов (качество по сравнению с производительностью) и некоторые типичные случайные распределения. Все довольно красиво и просто в использовании.
  • Если вам нужны другие методы / библиотеки - тогда используйте Google для криптографических случайных чисел, также вы можете использовать этот документ в качестве справочного.
  • Не выдумывайте ваши собственные решения, если вы не являетесь экспертом / исследователем в данной области / и т. д., воспользуйтесь уже существующими решениями, которые обычно пишутся умными людьми и тщательно проверяются другими умными людьми.
16
ответ дан 18 December 2019 в 05:15
поделиться

Не строго C ++, но специфично для Windows:

CryptGenRandom

Я уверен, что все операционные системы имеют свои эквивалентные криптографически безопасные функции генератора случайных чисел.

5
ответ дан 18 December 2019 в 05:15
поделиться

Случайное дает вам хорошее случайное число при равномерном распределении и при этом неплохо справляется.

Что-нибудь еще будет означать, что вы действительно хотите исказить распределение.

Например, использование генератора GUID от Microsoft даст вам случайный идентификатор, который с меньшей вероятностью будет повторяться и учитывает такие вещи, как время и компьютер.

-2
ответ дан 18 December 2019 в 05:15
поделиться
int unixrand()
{
   int x;
   int f = open("/dev/random", O_RDONLY);
   if (f < 0) return -1; /* Error */
   if (sizeof(x) != read(f, &x, sizeof(x))) {
       close(f);
       return -1;
   }
   close(f);       
   if (x < 0) x = ~x;
   return x;
}
2
ответ дан 18 December 2019 в 05:15
поделиться

Время, как правило, является наиболее случайной операцией, которая также является дешевой, но ее все еще можно предсказать.

Если вы хотите истинную случайность, единственным выходом является использование какого-либо внешнего входа.

Генератор квантовых случайных битов - это одна служба, предоставляющая такие данные.

-4
ответ дан 18 December 2019 в 05:15
поделиться

Этот код довольно эффективен. Хотя пользователи могут начать замечать закономерность после нескольких итераций.

int FastRandom()
{
  return 10;
}
14
ответ дан 18 December 2019 в 05:15
поделиться

(Перекрестная публикация из ответа, который я только что написал на аналогичный вопрос)

Взгляните на ISAAC (Косвенное обращение, Shift, Накопить, сложить и подсчитать). Он равномерно распределен и имеет среднюю длину цикла 2 ^ 8295.

Это тоже быстро, поскольку не требует умножения или модуля.

1
ответ дан 18 December 2019 в 05:15
поделиться

Bruce Schneier and John Kelsey wrote a random number generator you may be interested in. Rather, it's a seed generator. Even though Yarrow is no longer supported, you may be interested in how it gathers entropy.

OpenSSL has an API that is relatively easy to access and pretty portable. And Mozilla comes with a decent API that wraps whatever the OS offers.

Personally, though, I generally use Boost.Random, which was already suggested.

0
ответ дан 18 December 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: