生成带有 t 个随机向量的位向量

Generate bit vector with t random ones

本文关键字:向量 随机      更新时间:2023-10-16

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

这是我到目前为止编写的解决方案,但我不确定它是否是最有效的解决方案。此外,我以前从未使用过random_devicemt19937(在这里找到它们),所以我不知道可能的缺点是什么。

#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;

在这里演示!

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