我使用以下代码在C编程中生成随机数,但是对于每次编译,都会重复生成一组特定的随机数。谁能提到这里的修正???
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
main()
{
int i,a[40];
for(i=0;i<40;i++)
{
a[i] = rand() % 6;
printf("%d\n", a[i]);
}
getch();
}
答案 0 :(得分:4)
您需要将随机种子初始化为其他值,请参阅http://www.cplusplus.com/reference/cstdlib/rand/
答案 1 :(得分:2)
如果在对
rand()
进行任何调用之前调用srand()
,则应采用相同的顺序 生成为首次调用种子值为1时srand()
。 [emph。矿]
你需要把它混合起来,就像这样:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include <time.h>
main()
{
int i,a[40];
// seed the PRNG with some random value
// the current time is often used. You might want to incorporate
// other sources of entropy as well.
srand(time(NULL));
for( i = 0 ; i < 40 ; i++ )
{
a[i] = rand() % 6;
printf("%d\n", a[i]);
}
getch();
}
应该注意
合并更多实体来源而不仅仅依赖于当前系统时钟的原因是系统时钟本身不是非常随机 - 调用彼此非常接近,我的结果类似于序列。其他好的熵来源包括:
虽然如果您的软件正在运行(例如,在服务器上,键盘和鼠标可能处于闲置状态),查看用户界面组件(例如击键和鼠标移动)将不会以熵的方式为您买单很长一段时间。
答案 2 :(得分:1)
做这样的事情(插入行)来为随机数生成器播种:
//...
int i,a[40];
srand(clock()); //inserted line
for(i=0;i<40;i++)
//...
clock()
函数将为每个时钟滴答提供不同的种子值,从而导致rand()
函数的新的不同初始化。