【问题标题】:generate reliable pseudorandom number生成可靠的伪随机数
【发布时间】:2012-02-09 11:09:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios random srand


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 对于给定的实现是这样,但不一定是所有的实现。
      猜你喜欢
      • 2015-08-07
      • 2014-05-18
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 2018-03-20
      • 2014-10-30
      • 2018-05-20
      相关资源
      最近更新 更多