Random_shuffle算法-在没有随机生成器函数的情况下产生相同的结果
random_shuffle algorithm - are identical results produced without random generator function?
如果没有为标准库中的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)));
,但是结果往往是实现定义的(并且不可靠)。
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- 在这种情况下,java对象是否可以调用本机函数
- 这个c++代码是如何在没有定义函数的情况下运行的
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 如何在没有函数的情况下编写此代码并使C++更简单?
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- A类的定义需要B类的定义,如何在不公开B的定义的情况下公开A的公共函数?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- C++ strcpy 函数在少数主要情况下失败
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 如何在没有复制构造函数的情况下为地图设置值?
- 在这种情况下,如何传递成员函数而不是函数?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 在没有默认构造函数的情况下创建的派生对象
- 在双重继承的情况下如何处理非标准构造函数