генерировать надежное псевдослучайное число - PullRequest
2 голосов
/ 13 января 2012

Я хочу написать многопользовательскую игру на платформе iOS.Игра основывалась на случайных числах, которые генерируются динамически, чтобы решить, что будет дальше.Но это многопользовательская игра, так что это «случайное число» должно быть одинаковым для всех устройств для каждого игрока, чтобы иметь последовательную игру.

Для этого мне нужен хороший надежный генератор псевдослучайных чисел, который, если я начнусначала это один и тот же номер, чем он будет генерировать одинаковые последовательности случайных чисел на всех устройствах (iPad / iPhone / iPodTouch) и всех версиях ОС.

Похоже, srand и rand выполнят работу замне, но я не уверен, что rand гарантирует создание одного номера на всех устройствах для всех версий ОС?Иначе, есть ли хороший алгоритм генерации псевдослучайных чисел?

Ответы [ 2 ]

7 голосов
/ 13 января 2012

Из стандарта C (а Objective C - это тонкий слой поверх C, так что он все еще должен сохраняться):

Если затем вызывается srand с тем же начальным значением, последовательность псевдослучайные числа должны повторяться.

нет гарантии того, что разные реализации (или даже разные версии одной и той же реализации) будут давать согласованную последовательность на основена семени.Если вы действительно хотите это гарантировать, вы можете кодировать свой собственный линейный конгруэнтный генератор, такой как пример в самом стандарте:

// RAND_MAX assumed to be 32767.
static unsigned long int next = 1;
void srand(unsigned int seed) { next = seed; }
int rand(void) {
    next = next * 1103515245 + 12345;
    return (unsigned int)(next/65536) % 32768;
}

И, несмотря на то, чтоЧем лучше генераторы, тем более простой линейный конгруэнтный, как правило, более чем достаточно, если только вы не статистик или криптограф.

0 голосов
/ 13 января 2012

Если вы предоставляете начальное значение для rand, то оно должно последовательно предоставлять одинаковую последовательность псевдослучайных чисел. Вы также можете попробовать arc4random ().

...