代码之家  ›  专栏  ›  技术社区  ›  Joe

stdlib的rand()是否总是给出相同的序列?

  •  6
  • Joe  · 技术社区  · 14 年前

    rand() 似乎每次都给出相同的数字序列*。

    对于同一台机器/不同的机器/不同的体系结构上的重复执行,是否保证这样做?

    *显然是为了同一粒种子。

    6 回复  |  直到 14 年前
        1
  •  20
  •   Community dbr    7 年前

    是的,考虑到同样的项目环境。根据C标准§7.20.2.2/2,

    srand 函数使用参数作为后续调用返回的新伪随机数序列的种子 rand . 斯兰德 如果 在调用之前调用 斯兰德 如果已完成,则生成的顺序应与 斯兰德 首先使用种子值1调用。

    当然,这假设它使用相同的实现细节(即,在相同的执行期间使用相同的机器、相同的库)。C标准并不要求标准的随机数生成算法,因此,如果使用不同的C标准库运行程序,可能会得到不同的随机数序列。

    看到问题了吗 Consistent pseudo-random numbers across platforms 如果你需要一个可移植的,有保证的随机数序列和一个给定的种子。

        2
  •  2
  •   caf    14 年前

    对于传递给它的相同种子,它保证给出相同的序列 srand() -但是 仅在程序的一次执行期间 . 一般来说,如果一个实现在行为上有一个选择,那么在随后的执行过程中,对于该选择没有保持不变的具体要求。

    对于一个实现来说,在每次程序启动时选择一个“主种子”,并使用它以一种每次程序启动时都不同的方式来扰动伪随机数生成器是符合的。

        3
  •  1
  •   JoeG    14 年前

    不。

    如果srand然后用相同的 种子值 重复的。

    但它并没有说明伪随机数序列实际上是什么,所以在不同的实现中它是不同的。

    rand() 将为给定的种子提供相同的数字序列 对于给定的实现 . 不能保证在不同的机器或不同的体系结构中,顺序是相同的——而且几乎可以肯定的是不会是这样。

        4
  •  0
  •   bta    14 年前

    如果您需要使用完全相同的伪随机数集进行实验,那么您可以使用 srand 生成一长串随机数并将其写入文件/数据库。然后,编写一个可移植的“随机数生成器”函数,按顺序从该文件返回值。这样,您就可以放心,无论使用哪种平台,您都在使用相同的输入数据, 斯兰德

        5
  •  0
  •   Jens Gustedt    14 年前

    drand48 函数族。这些被规范化以在所有机器上使用相同的算法。

        6
  •  0
  •   e-sushi amandanovaes    11 年前

    如果您在UNIX/Linux环境中,您可以看到 drand48() 斯里兰卡48( online manuals 原型可以在 /usr/include/stdlib.h文件 第一种方法是使用模拟中常用的线性同余方法。

    include stdio.h
    include stdlib.h
    double drand48();
    int main(void){
        int i;
        double rn;
        srand48(2);
        for(i=0; i<10; i++){
            randNum = drand48();
            printf("%.6l\n", randNum);
            return 0;
    }