Это потому, что вы храните указатель на копию вашего объекта:
void Game::addPlayer(Player A)
Вам нужно использовать ссылку и сохранить ее:
void Game::addPlayer(Player& A)
В противном случае вы получите неопределенное поведение.
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 конечно, в состоянии греха "
Не строго C ++, но специфично для Windows:
Я уверен, что все операционные системы имеют свои эквивалентные криптографически безопасные функции генератора случайных чисел.
Случайное дает вам хорошее случайное число при равномерном распределении и при этом неплохо справляется.
Что-нибудь еще будет означать, что вы действительно хотите исказить распределение.
Например, использование генератора GUID от Microsoft даст вам случайный идентификатор, который с меньшей вероятностью будет повторяться и учитывает такие вещи, как время и компьютер.
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;
}
Время, как правило, является наиболее случайной операцией, которая также является дешевой, но ее все еще можно предсказать.
Если вы хотите истинную случайность, единственным выходом является использование какого-либо внешнего входа.
Генератор квантовых случайных битов - это одна служба, предоставляющая такие данные.
Этот код довольно эффективен. Хотя пользователи могут начать замечать закономерность после нескольких итераций.
int FastRandom()
{
return 10;
}
(Перекрестная публикация из ответа, который я только что написал на аналогичный вопрос)
Взгляните на ISAAC (Косвенное обращение, Shift, Накопить, сложить и подсчитать). Он равномерно распределен и имеет среднюю длину цикла 2 ^ 8295.
Это тоже быстро, поскольку не требует умножения или модуля.
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.