我想生成一个大小为v
的数组/向量p
,其中t
个和p-t
个零。 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;
答案 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