【发布时间】:2017-12-28 19:15:26
【问题描述】:
我正在使用srand((unsigned)time(NULL)) 在我的 C 程序中播种随机发生器。我注意到,当我使用循环创建一个随机数数组时,如果我将播种器放在循环内而不是循环外,所有数字都将相同。我认为这是因为循环运行得非常快,但是播种器如何在循环之外重新播种随机发生器?我对它在程序中的工作方式感到困惑。
【问题讨论】:
标签: c loops random random-seed
我正在使用srand((unsigned)time(NULL)) 在我的 C 程序中播种随机发生器。我注意到,当我使用循环创建一个随机数数组时,如果我将播种器放在循环内而不是循环外,所有数字都将相同。我认为这是因为循环运行得非常快,但是播种器如何在循环之外重新播种随机发生器?我对它在程序中的工作方式感到困惑。
【问题讨论】:
标签: c loops random random-seed
您应该只在您的程序中srand 一次。
因为time(NULL) 是以秒为单位测量的,所以在一个循环中,您实际上是一遍又一遍地播种相同的值。
每个种子都会产生一个确定性的伪随机数流,但是两次设置相同的种子会产生两次相同的序列。
关于srand:
http://www.cplusplus.com/reference/cstdlib/srand/
关于time:https://www.tutorialspoint.com/c_standard_library/c_function_time.htm
【讨论】:
使用srand((unsigned)time(NULL)) 播种随机数生成器并不可靠,因为time() 返回自 1970 年 1 月 1 日以来的秒数。该值每秒都在变化。如果您在同一秒内重新播种生成器,您确实会再次获得相同的随机序列。
您应该使用变化更快的来源:
srand((unsigned)clock());
此外,不建议重新播种生成器。伪随机数生成器经过精心设计,可以生成具有某些属性的随机序列。重新播种生成器打破了这个承诺。
【讨论】: