Random_shuffle算法-在没有随机生成器函数的情况下产生相同的结果

random_shuffle algorithm - are identical results produced without random generator function?

本文关键字:情况下 函数 结果 算法 Random 随机 shuffle      更新时间:2023-10-16

如果没有为标准库中的random_shuffle算法提供随机生成器函数,如果提供相同的数据,程序的连续运行是否会产生相同的随机序列?

例如,if

std::random_shuffle(filenames.begin(), filenames.end());

在程序的连续运行中对目录中的相同文件名列表执行,生成的随机序列是否与前一次运行中的相同?

如果您使用相同的随机生成器,具有相同的种子和相同的启动顺序,结果将是相同的。毕竟,电脑是它的行为是确定性的(模线程问题和其他一些问题)零头和零头)。

如果未指定生成器,则默认为实现定义的。我认为,大多数实现都使用std::rand()(这可能会导致问题,特别是当序列中大于RAND_MAX的元素)。我建议获得一个已知质量的生成器,并使用它。

如果您没有正确地为正在使用的生成器设置种子(另一个)不使用默认值的原因,因为如何设置它将取决于实现),那么你就会得到你所得到的。在…的情况下std::rand(),默认总是使用相同的种子。你是如何播种的?取决于所使用的发电机。你用来播种的应该是不同的从一个跑到另一个;对于许多应用,time(NULL)是足够的;在Unix平台上,我建议读取多少字节都可以它取自/dev/random。否则,散列其他信息(IP机器地址、进程id等)也可以改善事情——它意味着两个用户在同一秒启动程序仍然会得到不同的序列。(但这确实是唯一相关的)

25.2.11只是说元素以均匀分布进行洗牌。它不能保证在幕后使用哪个RNG(除非你传入一个),所以你不能依赖任何这样的行为。

为了保证相同的洗牌结果,您需要提供自己的RNG来提供这些保证,但我怀疑即使这样,如果您更新了标准库,random_shuffle算法本身也可能会改变效果。

每次运行程序都可能产生相同的结果。如果这是一个问题,您可以添加一个自定义随机数生成器(可以从外部源播种)作为std::random_shuffle的附加参数。函数是第三个参数。有些人建议在random_shuffle之前调用调用srand(unsigned(time(NULL)));,但是结果往往是实现定义的(并且不可靠)。

相关文章: