【问题标题】:Using time to seed the randomizer in C with loops [duplicate]使用时间在 C 中使用循环播种随机化器 [重复]
【发布时间】:2017-12-28 19:15:26
【问题描述】:

我正在使用srand((unsigned)time(NULL)) 在我的 C 程序中播种随机发生器。我注意到,当我使用循环创建一个随机数数组时,如果我将播种器放在循环内而不是循环外,所有数字都将相同。我认为这是因为循环运行得非常快,但是播种器如何在循环之外重新播种随机发生器?我对它在程序中的工作方式感到困惑。

【问题讨论】:

    标签: c loops random random-seed


    【解决方案1】:

    您应该只在您的程序中srand 一次。 因为time(NULL) 是以秒为单位测量的,所以在一个循环中,您实际上是一遍又一遍地播种相同的值。 每个种子都会产生一个确定性的伪随机数流,但是两次设置相同的种子会产生两次相同的序列。

    关于srandhttp://www.cplusplus.com/reference/cstdlib/srand/

    关于timehttps://www.tutorialspoint.com/c_standard_library/c_function_time.htm

    为什么一次: srand() — why call it only once?

    【讨论】:

    • 你也可以用 pid 异或来给种子增加一点“随机性”
    • 另外,最好将种子输出到日志中,这样可以重现错误
    【解决方案2】:

    使用srand((unsigned)time(NULL)) 播种随机数生成器并不可靠,因为time() 返回自 1970 年 1 月 1 日以来的秒数。该值每秒都在变化。如果您在同一秒内重新播种生成器,您确实会再次获得相同的随机序列。

    您应该使用变化更快的来源:

    srand((unsigned)clock());
    

    此外,不建议重新播种生成器。伪随机数生成器经过精心设计,可以生成具有某些属性的随机序列。重新播种生成器打破了这个承诺。

    【讨论】:

      猜你喜欢
      • 2012-08-10
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      相关资源
      最近更新 更多