我运行了一个名为rand()
四次的程序。我使用模数运算符将范围限制为1-6。产生的整数分别为2,5,4和2.我重新编程并获得相同的数字。然后我创建了一个全新的程序,也称为rand()
四次,我仍然得到整数序列2,5,4,2。然后我关闭计算机,重新启动,创建另一个新程序,调用rand()
四次,仍然得到序列2,5,4,2。
我理解你需要使用srand()
“种子”RNG的基础知识,它在不同的点开始序列,但我只是好奇:忘记播种片刻,是序列由rand()
安装,编译器和/或操作系统生成的?例如,以下任何一种结果都会产生不同的顺序:
或者它只是所有使用相同RNG算法的C编译器的问题,所以伪随机序列(从头开始)对每个人都是一样的吗?
答案 0 :(得分:6)
如果你不打电话给srand
,C说:
C99,7.20.2.2p2)“如果在对srand进行任何调用之前调用了rand,则应该生成与首次调用srand且种子值为1时相同的序列。”
因此,如果您的rand
函数(在C标准中未指定并允许实现)是一个算法PRNG,如果您不调用{srand
函数,则很可能会一次又一次地获得相同的序列{1}}。
答案 1 :(得分:0)
当你说"运行程序四次"时,听起来你只为每个种子获得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
召唤。