【问题标题】:Avoiding Repeated seed generation using srand()避免使用 srand() 重复生成种子
【发布时间】:2021-05-22 20:50:43
【问题描述】:

我有一个典型的情况,我需要生成一批随机数。我使用了一个循环,每次通过都会生成 100 个随机数:

for(int i=0; i<npasses; i++)
{
   srand(time(NULL)); //Initialize seed

   for(int j=0; j<100; j++)
      printf("%d ", rand()%10);

   printf("\n"); //New line after 100 numbers
}

现在,内部循环在不到一毫秒的时间内执行。结果,time() 的值没有变化。这会将种子 (srand()) 重新初始化为相同的值,并且我的随机数被重复..

任何人都可以提出解决方法/修复方法。

【问题讨论】:

    标签: c algorithm random srand


    【解决方案1】:

    您可以使用随机生成器生成新种子。

    例如:

    srand((unsigned int)rand());
    

    并且在循环之前只使用一次srand(time(NULL))。但正如另一个答案中所建议的那样,您也可以将整个 srand 放在循环中。

    【讨论】:

    • 这不仅没有必要,而且很危险。大多数生成器现在有超过 32 位的周期,并且使用 32 位种子重复重新播种会限制您仅使用有限数量的序列的前几个数字。在程序开始时调用 srand() 一次,并且只调用一次。
    【解决方案2】:

    在循环之前设置一次种子。

    【讨论】:

      【解决方案3】:

      试试这个

      srand(clock()); //Initialize seed
      

      【讨论】:

      • 我认为它会导致同样的问题?
      • @AshisKumarSahoo 我认为应该不一样。
      • 为什么不呢?系统时间无法在毫秒以下校准。 time() 已经在这样做了。我不认为clock() 可以正常工作。请澄清。
      • @AshisKumarSahoo()时间的返回值是以秒为单位的,而clock()的返回值通常是系统启动后的微秒。
      • @BLUEPIXY.. 我不这么认为。请引用一些参考资料。
      【解决方案4】:

      srand 拒之门外:

      srand(time(NULL)); //Initialize seed
      for(int i=0; i<npasses; i++)
      {
         for(int j=0; j<100; j++)
            printf("%d ", rand()%10);
      
         printf("\n"); //New line after 100 numbers
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-26
        • 1970-01-01
        • 2017-07-29
        • 2017-12-26
        • 1970-01-01
        • 1970-01-01
        • 2014-02-05
        相关资源
        最近更新 更多