2

我想在iOS平台上写一个多人游戏。游戏依靠动态生成的随机数来决定接下来会发生什么。但它是一个多人游戏,所以这个“随机数”对于每个玩家的所有设备都应该是相同的,以便获得一致的游戏玩法。

因此,我需要一个良好可靠的伪随机数生成器,如果我先播种相同的数字,它将在所有设备(iPad/iPhone/iPodTouch)和所有操作系统版本上保持生成相同的随机数序列。

看起来srand并且rand会为我完成这项工作,但我不确定是否rand保证在所有操作系统版本的所有设备上生成相同的数字?否则有什么好的伪随机数生成算法吗?

4

2 回答 2

7

来自 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;
}

而且,尽管周围有更好的生成器,但简单的线性同余生成器通常绰绰有余,除非您是统计学家或密码学家。

于 2012-01-13T07:43:02.750 回答
0

如果您向 rand 提供种子值,那么它应该始终提供相同的伪随机数序列。你也可以试试 arc4random()。

于 2012-01-13T07:44:44.673 回答