【问题标题】:Same srand seeds produces different values on different computers相同的 srand 种子在不同的计算机上产生不同的值
【发布时间】:2021-05-04 21:43:16
【问题描述】:

问题是这段代码每次运行时都会产生相同的值。但是完全相同的代码在我朋友的 PC 上产生不同的值。可能是什么原因,或者我做错了什么?

#define SIZE 100

int main(void) {

    srand(14012021);
    for (int i = 0; i < SIZE; ++i) {
        if (i && i % 10 == 0)
            printf("\n");
        printf("%d, ", (rand() % 2 ? 1 : -1) * (rand() % 1000));
    }
}

【问题讨论】:

  • 你希望它是随机的还是不随机的?可能在不同平台上实现不同,或者对算法的怪癖进行了一些深思熟虑,因此它是随机的
  • rand() 的实现在不同的计算机上使用不同的算法。如果您想要一致性,请包含特定的 PRNG。我喜欢pcg,但还有很多其他好的。
  • @close-votes:这个问题可能缺乏研究工作(这是一个潜在的否决原因),和/或之前可能已经回答过,但它不清楚,从某种意义上说,OP想知道什么是非常明显的。上面cmet中给出的解释也可能对其他人有所帮助。
  • @Shawn 好点!但是,我查看了 C11(草案)标准,并没有发现任何 explicit 说不同的实现可以为 相同的种子产生不同的序列。 IMO,对这个问题的权威答案将非常有用。
  • @AdrianMole: C 2018 7.22.2.1 4 说“无法保证产生的随机序列的质量,并且已知某些实现会产生具有令人痛苦的非随机低位比特的序列。 ”只有当不同的实现产生不同的序列时,这句话才有意义。

标签: c srand


【解决方案1】:

相同的 srand 种子在不同的计算机上产生不同的值

是的。特定的伪随机数算法是一个实施质量问题。它们可能很简单,也可能很复杂。如果您需要跨实现的一致行为,则需要自带。

有趣的事实:ISO C99 标准包含此操作方法:

以下函数定义了一个可移植的实现 兰特和兰特

static unsigned long int next = 1;

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

void srand(unsigned int seed) {
    next = seed;
}

【讨论】:

    猜你喜欢
    • 2018-02-13
    • 2020-04-24
    • 2012-11-02
    • 2014-04-03
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多