C++ 集合中的随机元素

C++ 集合中的随机元素,c++,C++,我有这样一套: set<vector<prmNode> > cammini 设置cammini 我需要从这个集合中取2个随机值(2个随机向量)。我怎么办?? 多谢各位 最简单的解决方案是执行以下两次 *(std::advance(cammini.begin(), rand() % cammini.size())) 如果您生成两个索引,按较小的值前进,然后按它们之间的差值前进,则可以更有效地执行此操作。最简单的解决方案是执行以下两次 *(std::advance(ca

我有这样一套:

set<vector<prmNode> > cammini
设置cammini
我需要从这个集合中取2个随机值(2个随机向量)。我怎么办??
多谢各位

最简单的解决方案是执行以下两次

*(std::advance(cammini.begin(), rand() % cammini.size()))

如果您生成两个索引,按较小的值前进,然后按它们之间的差值前进,则可以更有效地执行此操作。

最简单的解决方案是执行以下两次

*(std::advance(cammini.begin(), rand() % cammini.size()))

如果生成两个索引,按较小的索引前进,然后按它们之间的差值前进,则可以更有效地执行此操作。

请注意,这会偏向较小的索引。@Johannes,我不这么认为。你能详细说明一下吗?假设
rand()%常量
是有偏差的,而它往往是有偏差的。考虑到无偏差随机数的生成,这个想法本身是可行的,但集合可能不是从中挑选随机值的容器。啊,当然,
rand()%k
是有偏差的(无论
rand
本身的质量如何),但这是最好的方法,不需要使用Boost.Random或编写一段不平凡的代码。除非
RAND_MAX
cammini.size()
的精确倍数,因为这里使用的是模,所以得到较小索引的次数比得到较大索引的次数要多一些。当使用
%
获取最大为n的伪随机数时,这总是一个问题。如果
RAND_MAX
更大,问题就不那么严重了,但对于某些实现来说,它小得可笑。基本上,每个元素都有n个大小相等的间隔(size/n),在
rand()
范围的末尾有一个更小的间隔。最后一个较小的区间中的每个数字都会使[0,n)区间中的分布发生偏差。请注意,这会偏向较小的索引。@Johannes,我不这么认为。您能详细说明一下吗?假设
rand()%constant
是有偏的,它往往是有偏的。考虑到无偏随机数的生成,这个想法本身是可行的,但集合可能不是从中挑选随机值的容器。啊,当然,
rand()%k
是有偏的(不管
rand
本身的质量如何),但这是在不涉及Boost.Random或编写非琐碎代码的情况下所能做的最好的。除非
RAND_MAX
cammini.size()的精确倍数
由于这里使用的是模,所以得到较小索引的次数比得到较大索引的次数要多一些。当使用
%
得到最大为n的伪随机数时,这总是一个问题。如果
RAND_MAX
较大,则问题不大,但对于某些实现来说,它小得离谱。基本上你得到(size/n)n个元素的大小相等的间隔,并且在
rand()
的末尾,范围为一个较小的间隔。最后一个较小间隔中的每个数字都会扭曲[0,n)间隔中的分布。