C总是生成相同的随机序列吗?

时间:2015-08-28 17:37:12

标签: c random

我运行了一个名为rand()四次的程序。我使用模数运算符将范围限制为1-6。产生的整数分别为2,5,4和2.我重新编程并获得相同的数字。然后我创建了一个全新的程序,也称为rand()四次,我仍然得到整数序列2,5,4,2。然后我关闭计算机,重新启动,创建另一个新程序,调用rand()四次,仍然得到序列2,5,4,2。

我理解你需要使用srand()“种子”RNG的基础知识,它在不同的点开始序列,但我只是好奇:忘记播种片刻,是序列由rand()安装,编译器和/或操作系统生成的?例如,以下任何一种结果都会产生不同的顺序:

      
  • 在我的计算机上卸载并重新安装C编译器   
  • 在我的计算机上安装和使用不同的C编译器   
  • 使用相同的编译器在其他人的计算机上运行程序?   
  • 使用不同的编译器(可能是不同的操作系统)在其他人的计算机上运行程序?

或者它只是所有使用相同RNG算法的C编译器的问题,所以伪随机序列(从头开始)对每个人都是一样的吗?

3 个答案:

答案 0 :(得分:6)

如果你不打电话给srand,C说:

  

C99,7.20.2.2p2)“如果在对srand进行任何调用之前调用了rand,则应该生成与首次调用srand且种子值为1时相同的序列。”

因此,如果您的rand函数(在C标准中未指定并允许实现)是一个算法PRNG,如果您不调用{srand函数,则很可能会一次又一次地获得相同的序列{1}}。

答案 1 :(得分:0)

当你说&#34;运行程序四次&#34;时,听起来你只为每个种子获得srand()的一个值,这不是一个随机序列。要获得随机序列,您需要在同一程序运行中多次rand()/dev/random多次。如果您需要在程序执行过程中使用随机序列,则必须使用#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int l,j,i=0; int p;// scanning no of strings user wants to input scanf("%d",&p); char c; char **ptr=(char**)malloc(sizeof(char*)*p);// array of char pointer if(ptr!=NULL) { for(i=0;i<p;i++)//loop for p no of strings { j=0; ptr[i]=(char*)malloc(200*sizeof(char));//allocating memory to pointer to char array if(ptr[i]!=NULL)//string input procedure { while(1) { c=getchar(); if(c==EOF||c=='\n') { *(ptr[i]+j)='\0'; break; } *(ptr[i]+j)=c; j++; } printf("%s \n",ptr[i]); i++; } } } getch(); free(ptr); return 0; } 之类的内容。

答案 2 :(得分:0)

  

忘记播种片刻,是由rand()安装,编译器和/或OS依赖生成的序列吗?

这取决于特定的库实现,它可能是编译器安装的一部分或单独安装。不同的库实现可以给出不同的序列。我希望在两个不同系统上的相同库实现给出相同的值序列,但是假设它不使用本地系统信息作为PRNG算法的一部分。

唯一的要求是,对于相同的种子值,序列始终是相同的,并且如果调用rand而没有事先调用srand,则其行为就像srand一样曾被种子1召唤。