用t随机生成位向量

时间:2016-07-12 17:22:03

标签: c++ matlab vector random bit

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

这是我到目前为止所写的解决方案,但我不确定它是否是最有效的解决方案。另外我之前从未使用random_devicemt19937(找到它们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!

1 个答案:

答案 0 :(得分: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