C++;rand和srand在不同的机器上获得不同的输出 我想生成一个随机整数,所以我使用C++ RAND(空隙)和SRAND(int)函数: int main(){ srand(1); cout << rand() << endl; return 0; }

C++;rand和srand在不同的机器上获得不同的输出 我想生成一个随机整数,所以我使用C++ RAND(空隙)和SRAND(int)函数: int main(){ srand(1); cout << rand() << endl; return 0; },c++,random,multiplatform,C++,Random,Multiplatform,那为什么呢?rand()是否可能在多台机器上有不同的实现?我该怎么办 我想修改另一台机器,这样我也可以从该机器获得16807。 请注意,我喜欢计算机上的rand实现。请告诉我另一台机器如何得到与我相同的结果 提前谢谢。我想这是因为两个平台上的int/unsigned int大小不同。在您编译的两台计算机/操作系统上,整数/无符号整数的字节数是否相同?您使用的是什么平台/编译器 假设使用相同的rand/srand实现,则需要使用相同精度的数据类型(或适当的转换)来获得相同的结果。如果您的平台上有S

那为什么呢?rand()是否可能在多台机器上有不同的实现?我该怎么办

我想修改另一台机器,这样我也可以从该机器获得16807。
请注意,我喜欢计算机上的rand实现。请告诉我另一台机器如何得到与我相同的结果


提前谢谢。

我想这是因为两个平台上的int/unsigned int大小不同。在您编译的两台计算机/操作系统上,整数/无符号整数的字节数是否相同?您使用的是什么平台/编译器


假设使用相同的rand/srand实现,则需要使用相同精度的数据类型(或适当的转换)来获得相同的结果。如果您的平台上有STNTIT.H,尝试使用它(这样就可以定义显式的大小,例如UTI32 32)。

< P> C和C++规范没有定义一个特定的实现,用于<代码> RAND 或<代码> SRAND 。它们可以是任何东西,只要是随机的。您不能期望来自不同标准库的一致输出。

是的,
rand()
有不同的实现;他们没有要求是相同的

如果希望实现和平台之间的序列一致,可以复制第7.20.2节中的示例实现。请务必重命名
rand
srand
,以免与标准库的版本冲突。您可能需要调整代码,使类型在实现中具有相同的大小和范围(例如,使用
中的
uint32\t
,而不是
无符号int

编辑:考虑到评论中的新信息,要求似乎与我们的想法不同(我仍然不完全清楚它们是什么)

您希望在两个系统上生成与在一个系统上生成的存储文件一致的随机数,但由于网络问题,无法将其传输到另一个系统(该文件约为1 GB)。(将其刻录到DVD,或将其拆分并刻录到2张CD,这不是一个选项?)

建议的解决办法:


编写一个自定义生成器,在两个系统上生成一致的结果(即使它们与您以前得到的结果不同)。完成后,使用它在两个系统上重新生成一个新的1GB数据文件。现有文件变得不必要,您不需要传输大量数据。

rand的实现可能会有所不同。如果在不同的机器上需要相同的行为,则需要一个随机数生成器来提供该行为。你可以自己滚,也可以用别人的

我不确定C++0x库中的随机生成器是否足够。我想不是。但是在那里读《标准》让我头晕目眩

同样,我也不确定这是否足够。但我觉得值得一看。在那里你有源代码,所以最坏的情况下它可以作为你自己滚动的基础


干杯,还有不同的伪RNG算法(例如LCG与Mersenne Twister)


第一台计算机上的C编译器可能会使用一台,第二台计算机可能会使用另一台。

完全正确。该标准为给定的起始种子指定了一个一致的序列,但该保证不适用于所有实现。该标准还显示了
srand()
rand()
的示例实现,但是没有使用它的要求。好的,你说得对。但是我该怎么办呢?我想手动实现一个rand函数,以使它在我的机器上得到与标准rand相同的结果。如何在我的机器中看到rand实现?它在哪里?!我找不到它。不知道我该怎么办?他,哪个叫基思·汤普森,这个还是那个?我的意思是,“我们必须做点什么。这是一些事情。因此,我们必须做这件事。”一个?是的,我就是那个(即,另一个)。好的,你是对的。但是我该怎么办呢?我想手动实现一个rand函数,以使它在我的机器上得到与标准rand相同的结果。如何在我的机器中看到rand实现?它在哪里?!我找不到它。我想要一个rand函数,它在第一次执行时为我提供16807!在第二次执行时给出相同的结果,在第三次执行时也是如此。@Pro:您使用的是什么系统(编译器和操作系统)?你为什么要在第一次执行时得到16807?16806会不会太小?@Pro:MacOSX基于BSD。如果他们没有太多分歧,他们可能会使用相同的算法。但我仍然认为,在两个系统上获得一致的生成器并重新生成文件是一种更好的方法。16807可能是MacOS上的结果。这是一个非常糟糕的随机发生器。
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;
}