在C ++中采样3个整数而不进行替换

斯蒂芬·洛朗(Stephane Laurent)

我想在其中三个整数之间进行采样{0, 1, ..., n-1}而不进行替换。

到目前为止,这是我的工作方式:

#include <random>

/* constructs vector {0, 1, ..., n-1} --------------------------------------- */
template <class T>
std::vector<T> integers_n(T n) {
  std::vector<T> out(n);
  for(T i = 0; i < n; i++) {
    out[i] = i;
  }
  return out;
}

/* samples three integers among {0, 1, ..., n-1} ---------------------------- */
const std::vector<int> choose3(const int n,
                               std::default_random_engine& generator) {
  std::uniform_int_distribution<int> sampler1(0, n - 1);
  std::uniform_int_distribution<int> sampler2(0, n - 2);
  std::uniform_int_distribution<int> sampler3(0, n - 3);
  const int i1 = sampler1(generator);
  const int i2 = sampler2(generator);
  const int i3 = sampler3(generator);
  std::vector<int> elems = integers_n(n);
  elems.erase(elems.begin() + i1);
  const int j2 = elems[i2];
  elems.erase(elems.begin() + i2);
  const int j3 = elems[i3];
  return {i1, j2, j3};
}

这有效,但是有更好的方法吗?

我想循环执行多次此采样。重新定义每次迭代的采样器是否很耗时?

由于技术原因,我只能使用C ++ 11。

贾斯汀

您可以在不进行替换的0, ..., n - 1情况下进行采样,而无需分配任何额外的内存。elem不需要。关键是模拟Fisher-Yates Shuffle的几个步骤,如David Eisenstat对我相关问题的回答所示

// std::array<int, 3> requires no heap allocation, so is a better choice.
std::array<int, 3> choose3(const int n,
                           std::default_random_engine& generator) {
    std::uniform_int_distribution<int> sampler1(0, n - 1);
    std::uniform_int_distribution<int> sampler2(0, n - 2);
    std::uniform_int_distribution<int> sampler3(0, n - 3);
    // Algorithm translated from https://stackoverflow.com/a/64359519/1896169
    int i1 = sampler1(generator);
    int i2 = sampler2(generator);
    int i3 = sampler3(generator);

    if (i3 == i2) i3 = n - 2;
    if (i3 == i1) i3 = n - 1;
    if (i2 == i1) i2 = n - 1;
    return {i1, i2, i3};
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C ++中采样3个整数而不进行替换

来自分类Dev

如何使用C ++ Uniform_int_distribution进行采样而不进行替换

来自分类Dev

C - 赋值从指针生成整数而不进行强制转换

来自分类Dev

如何在C中不进行赋值而强制转换指针?

来自分类Dev

在C#转换数组中不进行复制

来自分类Dev

“传递'goodString'的参数1使指针从整数而不进行强制转换”编译器错误-C

来自分类Dev

C语言中的强制转换警告:赋值使指针不进行强制转换而生成整数

来自分类Dev

使用n个唯一整数生成随机整数而不进行替换以获得固定的总和(Python)

来自分类Dev

在HashMap中获取整数而不进行迭代

来自分类Dev

跟踪C中的整数列表,并从该列表中采样

来自分类Dev

在R中生成随机整数对而不进行替换

来自分类Dev

在C ++中实现type_id(T)而不进行类型注册或RTTI

来自分类Dev

如何在不进行硬编码的情况下获取C ++中类数组的长度?

来自分类Dev

如何仅使用if语句在C中编写3个整数升序算法?

来自分类Dev

熊猫不进行统计就重新采样

来自分类Dev

在C ++中对64位整数进行按位(Bitshift)操作

来自分类Dev

如何使用C中的链表进行大整数乘法?

来自分类Dev

C 替换 C++ 中的 &

来自分类Dev

在不进行隐式/显式强制转换的情况下在C中查找字节序

来自分类Dev

使用c ++进行su -c替换

来自分类Dev

C#regex.replace需要替换3个或更多空格

来自分类Dev

C ++文件输入在线读取3个整数

来自分类Dev

c:更改变量类型而不进行强制转换

来自分类Dev

将C数组绑定到Numpy数组而不进行复制

来自分类Dev

从C字符数组创建PyString而不进行复制

来自分类Dev

替换c中的单词

来自分类Dev

c 中的 Read() 整数

来自分类Dev

在C ++中替换两个迭代器之间的范围

来自分类Dev

C#从7个整数中获取最大差

Related 相关文章

  1. 1

    在C ++中采样3个整数而不进行替换

  2. 2

    如何使用C ++ Uniform_int_distribution进行采样而不进行替换

  3. 3

    C - 赋值从指针生成整数而不进行强制转换

  4. 4

    如何在C中不进行赋值而强制转换指针?

  5. 5

    在C#转换数组中不进行复制

  6. 6

    “传递'goodString'的参数1使指针从整数而不进行强制转换”编译器错误-C

  7. 7

    C语言中的强制转换警告:赋值使指针不进行强制转换而生成整数

  8. 8

    使用n个唯一整数生成随机整数而不进行替换以获得固定的总和(Python)

  9. 9

    在HashMap中获取整数而不进行迭代

  10. 10

    跟踪C中的整数列表,并从该列表中采样

  11. 11

    在R中生成随机整数对而不进行替换

  12. 12

    在C ++中实现type_id(T)而不进行类型注册或RTTI

  13. 13

    如何在不进行硬编码的情况下获取C ++中类数组的长度?

  14. 14

    如何仅使用if语句在C中编写3个整数升序算法?

  15. 15

    熊猫不进行统计就重新采样

  16. 16

    在C ++中对64位整数进行按位(Bitshift)操作

  17. 17

    如何使用C中的链表进行大整数乘法?

  18. 18

    C 替换 C++ 中的 &

  19. 19

    在不进行隐式/显式强制转换的情况下在C中查找字节序

  20. 20

    使用c ++进行su -c替换

  21. 21

    C#regex.replace需要替换3个或更多空格

  22. 22

    C ++文件输入在线读取3个整数

  23. 23

    c:更改变量类型而不进行强制转换

  24. 24

    将C数组绑定到Numpy数组而不进行复制

  25. 25

    从C字符数组创建PyString而不进行复制

  26. 26

    替换c中的单词

  27. 27

    c 中的 Read() 整数

  28. 28

    在C ++中替换两个迭代器之间的范围

  29. 29

    C#从7个整数中获取最大差

热门标签

归档