【问题标题】:Generate bit vector with t random ones生成 t 个随机位向量
【发布时间】:2016-11-15 01:49:41
【问题描述】:

我想生成一个大小为p 的数组/向量v,其中t 为1,p-t 为0。 t 的位置必须是随机的。

这是我迄今为止编写的解决方案,但我不确定它是否是最有效的解决方案。另外我之前没用过random_device或者mt19937(发现他们here),所以不知道有什么缺点。

#include <algorithm>
#include <random>
#include <vector>
...
int p=10, t=3;
std::vector<int> v(p,0);
for(int i=0;i<t;i++)  //better way?
    v[i] = 1;
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(std::begin(v), std::end(v), g);

这是我试图重现的 matlab 代码:

rp = randperm(p);
I_s(i,:) = rp(1:t);
v = zeros(p,1);
v(I_s(i,:)) = 1;

Demo here!

【问题讨论】:

  • std::fill 可能会替换您的循环。
  • 顺便说一句,codereview.stackexchange.com 可能是一个更好的地方。
  • 这看起来不像“位向量”。它是简单的整数向量!
  • @Jarod42 感谢您的提示,我认为 std::fill_n 甚至是更好的解决方案。是的,也许 codereview.stackexchange.com 是一个更好的地方,希望一些管理员移动它
  • @justHelloWorld 你可以修改标记并要求他们移动它。

标签: c++ matlab vector random bit


【解决方案1】:
std::shuffle(std::begin(v), std::end(v), g);

不会使位位置随机化,它只是随机改变向量中现有项(均设置了零位位)的位置。


如果我正确理解了您的要求,您实际上应该拥有的是:

std::random_device rd;
std::mt19937 g(rd());
for(int i=0;i<t;i++)
     v[i] = 1 << rd(); // set a random bit position

【讨论】:

  • 我的逻辑有点不同:用0初始化v,用1填充前t个位置,通过std::shuffle随机排列v。相信我,它有效;)
  • @justHelloWorld 我怀疑 它是否有效“t 的位置必须是随机的。” 您的示例中没有代码来操作位位置。
  • @justHelloWorld 所以你的std::vector&lt;int&gt; 是为了代表每个元素中的一个位?这对我来说看起来非常低效。 std::bitset 甚至是臭名昭著的 std::vector&lt;bool&gt; specialzaiton,您可能会更好。
  • 你是对的,但这将用于Eigen,不幸的是,你不能在其中声明boolstd::bitset vecotr。
猜你喜欢
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多