random_shuffle算法 - 没有随机生成函数产生相同的结果?

时间:2011-08-09 16:52:07

标签: c++ standard-library

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

例如,如果

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

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

3 个答案:

答案 0 :(得分:7)

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

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

如果您没有正确播种正在使用的发电机(另一台 不使用默认值的原因,因为你如何播种它将取决于 实施),然后你会得到你得到的。如果是 std::rand(),默认值始终使用相同的种子。你如何种子 取决于使用的发电机。你用什么种子它应该是变化的 从一次奔跑到另一次奔跑;对于许多应用程序,time(NULL)是 足够;在Unix平台上,我建议读取很多字节 需要/dev/random。否则,散列其他信息(IP 机器的地址,进程ID等)也可以改善事物---它 表示两个用户以完全相同的秒数启动程序 仍会得到不同的序列。 (但这只是相关的 如果你在网络环境中工作。)

答案 1 :(得分:6)

25.2.11只是说元素是均匀分布的。它无法保证在幕后使用哪个RNG(除非您将其传入),因此您不能依赖任何此类行为。

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

答案 2 :(得分:4)

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