C++ 避免竞争条件的rand()替代方案?

C++ 避免竞争条件的rand()替代方案?,c++,c++11,C++,C++11,根据: 在C语言中,rand使用的生成算法保证为 此函数的高级调用。在C++中,这个约束是 放松,并且允许库实现来推进 其他情况下的生成器(例如调用 ) 但这里写着: 该函数访问和修改内部状态对象,这些对象可能 通过同时调用rand或srand导致数据争用 有些库提供了一个替代函数,可以显式避免 这种数据竞争:rand_r(不可移植) 允许C++库实现来保证 调用此函数 理想情况下,我希望有某种rand的“实例”,因此对于该实例和给定的种子,我总是为调用该实例生成相同的数字序列。在当前版本中,在

根据:

在C语言中,rand使用的生成算法保证为 此函数的高级调用。在C++中,这个约束是 放松,并且允许库实现来推进 其他情况下的生成器(例如调用 )

但这里写着:

该函数访问和修改内部状态对象,这些对象可能 通过同时调用rand或srand导致数据争用

有些库提供了一个替代函数,可以显式避免 这种数据竞争:rand_r(不可移植)

允许C++库实现来保证 调用此函数

理想情况下,我希望有某种rand的“实例”,因此对于该实例和给定的种子,我总是为调用该实例生成相同的数字序列。在当前版本中,在某些平台上,其他函数对rand()的调用(甚至可能在不同的线程上)可能会影响代码在线程中生成的数字序列

有没有一种替代方法,我可以保留某种“实例”,在给定种子的情况下,我可以保证生成特定序列,并且其他对不同“实例”的调用不会影响它

编辑:为了清晰起见-我的代码将在多个不同的平台上运行(iOS、Android、Windows 8.1、Windows 10、Linux等),目前我不可能测试每个实现。我只想基于标准所保证的内容实现一些东西…

使用random()而不是rand()

您可以使用并保留一个带有您的通用种子的生成器(全部来自
库)

如果需要生成一个,可以使用:

std::random_device rd{};
std::mt19937 gen(rd());
dis(MIN,MAX)
部件设置了此分布可以产生的最小值和最大值的范围,这意味着它永远不会生成大于
MAX
或小于
MIN
的值


最后,您可以将生成器与此分布一起使用,生成所需的随机值,如:
dis(gen)
。该发行版可以使用任何生成器,因此如果您希望其他发行版具有相同的随机数序列,您可以复制一份
gen
,或者使用相同的种子并构造两个或多个生成器。

查看C++11随机数功能:@aschepler我不太关心这些数字的“随机性”。。有这么多不同的引擎,要弄清楚哪一个引擎符合我在问题中提出的要求需要很长时间。好的,但是新的方法允许你存储所有你想要的状态,而不是依赖于某个全局状态。@Aschepper你能解释一下哪个引擎存储状态吗?有这么多不同的引擎,不清楚使用哪一个,还有可移植性问题(该功能是否在所有平台上都可用),而“随机性”/“伪随机性”对我来说并不重要。假设每个平台上都有库,如果您在每个线程上使用算法、分布和种子(对于每个线程),并且假设您将获得相同数量的调用,那么我希望具有相同的序列……安全性对于我来说并不重要。你能解释一下为什么随机性更好吗?我可以给它种子,然后得到相同的序列吗?random()不是STL的一部分。。STL有什么建议吗?这是STL的一部分吗?@ KaizerSozay,是的,它来自标准C++库。DIS和Gen完全独立于STD的其他实例::MT97 37和STD::我在你链接到的文档中找不到……是的,它们是。一个是随机生成器,另一个是随机算法。std::mt19937的两个实例彼此无关(即,此处没有共享数据)。
std::mt19937 gen{};
gen.seed(SEED);
std::random_device rd{};
std::mt19937 gen(rd());