【问题标题】:Choose random structs from vector of structs从结构向量中选择随机结构
【发布时间】:2014-10-13 01:28:38
【问题描述】:

我有一个结构向量:

struct entries 
{
   double km1, km2, km3;
};

我已将结构存储在向量中。我想从向量中选择 2 个随机结构并显示随机选择的结构的每个元素:km1、km2、km3

我在 stackoverflow 上发现了一个类似的问题,但它是针对整数向量的,并且由于某种原因没有返回随机结构。谢谢

【问题讨论】:

  • 这两个结构是否必须不同,或者随机选择可以为两者选择相同的结构值?
  • @cdhowie 他们需要有所不同,因为我正在为 k-means 算法选择集群
  • @GeorgeCostanza 我们可以使用rand()
  • @Winestone 是的,我们可以

标签: c++ random vector struct


【解决方案1】:

选择两者相当容易:

template <typename Iterator, typename Engine>
std::tuple<Iterator, Iterator> pick_two(Iterator begin, Iterator end, Engine & engine)
{
    int size = end - begin;

    if (size < 2) {
        throw std::invalid_argument("Sequence does not contain two elements");
    }

    std::uniform_int_distribution<int> distribution(0, size - 1);

    int first = distribution(engine);
    int second;

    do {
        second = distribution(engine);
    } while (first == second);

    return std::make_tuple(begin + first, begin + second);
}

你可以这样称呼它,给定一个全局 std::default_random_engine random_engine; 和一个名为 v 的向量:

auto choices = pick_two(v.begin(), v.end(), engine);

您可以使用*(std::get&lt;0&gt;(choices)) 获取第一个结构值,使用*(std::get&lt;1&gt;(choices)) 获取第二个结构值,然后使用您喜欢的任何方法输出值。

【讨论】:

  • 谢谢,知道要包含哪些标题吗?得到类似的东西:命名空间std中的default_random_engine没有命名一个类型,错误:uniform_int_distribution不是std的成员,错误:引擎没有在这个范围内声明,错误:无法从推导出自动
  • @GeorgeCostanza #include &lt;random&gt; 我认为
  • @winestone 是的,我随机包含在内。我想打勾我就是无法编译代码
  • @GeorgeCostanza 每次默认构造 std::default_random_engine 时,它都允许以相同的状态开始。考虑为整个程序创建一个这样的对象(假设你不是多线程的)并重复使用它。
  • 远远超出我的专业知识,但我最终会弄清楚的。谢谢
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多