创建一个随机的std ::向量,其中一个和零C

Creating a random std::vector with ones and zeros C++

本文关键字:一个 std 随机 创建 向量      更新时间:2023-10-16

我想以我设置的比例创建一个随机1和0的向量(在程序中,我称之为辍学),向量与以前创建的向量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;
    }
  }
}

哪个起作用,但对于巨大的向量非常慢,是否有更快的方法可以做到这一点?我非常新的C 。

任何帮助都将不胜感激

  1. 您确实知道Bernoulli发行版,对吗?您可以使用它直接生成整数向量。
    示例:

    #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. 另外,您可以创建一个所需尺寸的整数向量(将所有元素设置为0),将第一个N元素设置为1,其中n为 (1 - dropout) * size比例)然后洗牌矢量。

    #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

相关文章: