c++ - 用 ones 和 zeros C++ 创建一个随机的 std::vector

标签 c++ random stdvector

我想按我设定的比例创建一个由随机 1 和 0 组成的 vector (在我称之为 dropout 的程序中)该 vector 与之前创建的 vector CSUM 大小相同。

在 MATLAB 中会是

dropout=0.9;
n_elements=size(CSUM)
drpoutmask = (rand(n_elements) > dropout); 

在 C++ 中我有

size_t elements = Csum.size();
std::vector<float> y(elements);
std::uniform_real_distribution<float> distribution(0.0f, 1.0f); 
std::mt19937 engine; // Mersenne twister MT19937
auto generator = std::bind(distribution, engine);
std::generate_n(y.begin(), elements, generator);
std::vector<int> dropoutmask(elements,0);
float dropout=0.9;

for(int i=0; i<elements; i++)
  {
  if(y.at(i)>dropout)
    {
    dropoutmask.at(i)=1;
    }
  }
}

哪个有效,但是对于巨大的 vector 来说非常非常慢,有没有更快的方法来做到这一点?我是 C++ 的新手。

任何帮助将不胜感激

最佳答案

  1. 你知道 bernoulli distribution , 正确的?您可以使用它直接生成整数 vector 。
    示例:

    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <random>
    
    int main()
    {
        constexpr double dropout = 0.9; // Chance of 0
        constexpr size_t size = 1000;
        std::random_device rd;
        std::mt19937 gen(rd());
        std::bernoulli_distribution dist(1 - dropout); // bernoulli_distribution takes chance of true n constructor
    
        std::vector<int> dropoutmask(size);
        std::generate(dropoutmask.begin(), dropoutmask.end(), [&]{ return dist(gen); });
        size_t ones = std::count(dropoutmask.begin(), dropoutmask.end(), 1);
        std::cout << "vector contains " << ones << " 1's, out of " << size << ". " << ones/double(size) << "%\n";
        std::cout << "vector contains " << size - ones << " 0's, out of " << size << ". " << (size - ones)/double(size) << "%\n";
    }
    

    实例:http://coliru.stacked-crooked.com/a/a160743185ded5c5

  2. 或者,您可以创建一个所需大小的整数 vector (这会将所有元素设置为 0),将前 N 个元素设置为 1,其中 n 是 (1 - dropout) * size(你说你想要一个比例,而不是接近比例的随机数量)然后洗牌 vector 。

    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <random>
    
    int main()
    {
        constexpr double dropout = 0.9; // Chance of 0
        constexpr size_t size = 77;
        std::random_device rd;
        std::mt19937 gen(rd());
    
        std::vector<int> dropoutmask(size);
        std::fill_n(dropoutmask.begin(), dropoutmask.size() * (1 - dropout), 1);
        std::shuffle(dropoutmask.begin(), dropoutmask.end(), gen);
    
        size_t ones = std::count(dropoutmask.begin(), dropoutmask.end(), 1);
        std::cout << "vector contains " << ones << " 1's, out of " << size << ". " << ones/double(size) << "%\n";
        std::cout << "vector contains " << size - ones << " 0's, out of " << size << ". " << (size - ones)/double(size) << "%\n";
    
        for (auto i :dropoutmask) {
            std::cout << i << ' ';   
        }
        std::cout << '\n';
    }
    

实例:http://coliru.stacked-crooked.com/a/0a9dacd7629e1605

关于c++ - 用 ones 和 zeros C++ 创建一个随机的 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40983346/

相关文章:

c++ - Apple Mach -O(ID)链接器错误,ncurses

c++ - Gcc 编译的可执行文件产生 "access denied"消息?

c++ - 使用STL对部分 vector 进行排序

javascript - 如何在js中分散随机定位的图像?

Java:随机类建议

c++ - 带数据交换的 std::vector 指针

c++ - 静态类成员,这是一个结构

c++ - it = map.find (element) == map.end() have it->second 是否正常?

c++ - 没有合适的从 std::string 到 int 的转换

python - Randrange 依赖于变量 - Python