生成可靠的伪随机数

时间:2012-01-13 07:38:12

标签: ios random srand

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

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

看起来srandrand会为我完成这项工作,但我不确定rand是否保证在所有操作系统版本的所有设备上生成相同的号码?否则是否有任何好的伪随机数生成算法?

2 个答案:

答案 0 :(得分:7)

从C标准(而目标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;
}

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

答案 1 :(得分:0)

如果为rand提供种子值,则应始终提供相同的伪随机数序列。您也可以尝试使用arc4random()。

相关问题