drb*_*drb 6 c++ standard-library
如果没有为标准库中的random_shuffle算法提供随机生成器函数,如果提供相同的数据,程序的连续运行是否会生成相同的随机序列?
例如,如果
std::random_shuffle(filenames.begin(), filenames.end());
Run Code Online (Sandbox Code Playgroud)
在程序的连续运行中,在目录中的同一文件名列表上执行,生成的随机序列与先前运行中的相同吗?
如果使用相同的随机生成器,具有相同的种子和相同的起始序列,结果将是相同的.毕竟,计算机的行为是确定性的(模数线程问题和其他一些可能性和结果).
如果未指定生成器,则默认生成器是实现定义的.我认为大多数实现都使用
std::rand()(这可能会导致问题,特别是当序列中的元素数量大于时RAND_MAX).我建议使用已知质量的发电机并使用它.
如果你没有正确播种正在使用的生成器(不使用默认值的另一个原因,因为你如何播种它将取决于实现),那么你将得到你得到的.在这种情况下
std::rand(),默认值始终使用相同的种子.种子如何取决于使用的发电机.你用它来播种它应该是从一个跑到另一个跑; 对于许多应用来说,time(NULL)足够了; 在Unix平台上,我建议读取它需要多少字节/dev/random.否则,散列其他信息(机器的IP地址,进程ID等)也可以改善事情 - 这意味着两个用户在完全相同的时间内启动程序仍然会得到不同的序列.(但是,如果您在网络环境中工作,这只是相关的.)
25.2.11只是说元素是均匀分布的.它不能保证在幕后使用哪个RNG(除非您将其传入),因此您不能依赖任何此类行为.
为了保证相同的洗牌结果,您需要提供自己的RNG来提供这些保证,但我怀疑即使这样,如果您更新标准库,random_shuffle算法本身也可以改变效果.