生成随机数的问题

时间:2014-04-28 17:41:31

标签: c

我使用以下代码在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();
}

3 个答案:

答案 0 :(得分:4)

您需要将随机种子初始化为其他值,请参阅http://www.cplusplus.com/reference/cstdlib/rand/

答案 1 :(得分:2)

Per the documentation

  

如果在对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();
}

应该注意

  • 在执行开始时仅对PRNG播种一次
  • 合并更多实体来源而不仅仅依赖于当前系统时钟的原因是系统时钟本身不是非常随机 - 调用彼此非常接近,我的结果类似于序列。其他好的熵来源包括:

    • 硬盘统计信息
    • 网络I / O
    • 流程活动
    • 击键延迟
    • 鼠标移动

虽然如果您的软件正在运行(例如,在服务器上,键盘和鼠标可能处于闲置状态),查看用户界面组件(例如击键和鼠标移动)将不会以熵的方式为您买单很长一段时间。

答案 2 :(得分:1)

做这样的事情(插入行)来为随机数生成器播种:

  //...
  int i,a[40];
  srand(clock());  //inserted line
  for(i=0;i<40;i++)
  //...

clock()函数将为每个时钟滴答提供不同的种子值,从而导致rand()函数的新的不同初始化。