генерировать надежное псевдослучайное число

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

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

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


person Bryan Chen    schedule 13.01.2012    source источник


Ответы (2)


Из стандарта 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;
}

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

person paxdiablo    schedule 13.01.2012

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

person aqua    schedule 13.01.2012
comment
Это верно для данной реализации, но не обязательно для всех реализаций. - person paxdiablo; 13.01.2012