如果没有为标准库中的random_shuffle算法提供随机生成器函数,如果提供相同的数据,程序的连续运行是否会生成相同的随机序列?
例如,如果
std::random_shuffle(filenames.begin(), filenames.end());
是在程序的连续运行中从目录中的同一文件名列表上执行的,是否产生的随机序列与之前运行的相同?
答案 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
,但结果通常是实现定义的(并且不可靠)。