【发布时间】: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 说“无法保证产生的随机序列的质量,并且已知某些实现会产生具有令人痛苦的非随机低位比特的序列。 ”只有当不同的实现产生不同的序列时,这句话才有意义。