如果没有为标准库中的random_shuffle算法提供随机生成器函数,那么如果提供相同的数据,程序的连续运行是否会产生相同的随机序列?
例如,如果
std::random_shuffle(filenames.begin(), filenames.end());在程序的连续运行中对目录中的相同文件名列表执行,产生的随机序列是否与前一次运行中的随机序列相同?
发布于 2011-08-10 01:05:04
25.2.11只是说元素是均匀分布的。它不能保证在幕后使用哪个RNG (除非你传入了一个),所以你不能依赖任何这样的行为。
为了保证相同的shuffle结果,您需要提供自己的RNG来提供这些保证,但我怀疑即使这样,如果您更新您的标准库,random_shuffle算法本身也可能改变效果。
发布于 2011-08-10 01:11:45
如果您使用相同的随机生成器,具有相同的种子和相同的启动序列,结果将是相同的。毕竟,计算机的行为是确定性的(模线程问题和其他一些零星的东西)。
如果不指定生成器,则默认生成器为实现定义的生成器。我认为大多数实现都使用std::rand() (这可能会导致问题,特别是当序列中的元素数量大于RAND_MAX时)。我会推荐一个已知质量的生成器,并使用它。
如果您没有正确地设定正在使用的生成器的种子(不使用默认值的另一个原因,因为您如何设定它将取决于实现),那么您将得到您所得到的。对于std::rand(),默认设置始终使用相同的种子。如何设定种子取决于所使用的生成器。每次运行时使用的种子应该有所不同;对于许多应用程序,time(NULL)就足够了;在Unix平台上,我建议从/dev/random读取多少字节。否则,散列其他信息(机器的IP地址、进程id等)也可以改善事情-这意味着两个用户在完全相同的时间启动程序仍然会得到不同的序列。(但只有在网络环境中工作时,这才是真正相关的。)
https://stackoverflow.com/questions/6999845
复制相似问题