【问题标题】:Problems in generating random numbers [duplicate]生成随机数的问题[重复]
【发布时间】:2014-06-14 09:23:51
【问题描述】:

我在 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();
}

【问题讨论】:

  • 您使用了错误的标签。这不是 C# 问题。
  • 您没有正确初始化随机种子。下面有多个正确答案可以解决这个问题。
  • 这个问题反复问;请在提出问题之前付出一些努力并进行搜索。这样,您将更快地得到答案,而不会浪费任何人的时间。这是每个人的胜利。

标签: c


【解决方案1】:

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

【讨论】:

  • 虽然理论上这可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。
  • @AndrewBarber 是的,但我有点懒,请投反对票,以便其他答案排在首位:)
【解决方案2】:

Per the documentation,

如果在调用srand() 之前调用rand()相同的序列应该 在第一次调用 srand() 时生成,种子值为 1。 [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
    • 流程活动
    • 击键延迟
    • 鼠标移动

虽然如果您的软件正在运行(例如,在键盘和鼠标可能长时间闲置的服务器上),那么查看诸如击键和鼠标移动之类的用户界面组件不会给您带来太多的熵一段时间。

【讨论】:

  • 你的应该是公认的答案:)
【解决方案3】:

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

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

clock() 函数将在每个 时钟滴答 中提供不同的 seed 值,从而对 rand() 函数进行新的不同初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-23
    • 2013-11-30
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    相关资源
    最近更新 更多