C++ 使用std::二项式分布在范围之间生成随机数

C++ 使用std::二项式分布在范围之间生成随机数,c++,random,sparse-matrix,C++,Random,Sparse Matrix,我创建了一个函数来生成稀疏矩阵,但是随机生成器只生成1s的值,我需要让它生成特定范围内的数字 size_t spare_matrix_generator(int *M, size_t rows, size_t cols) { std::random_device rd; std::mt19937 gen(rd()); gen.seed(time(NULL)); std::binomial_distribution<int> distribution(

我创建了一个函数来生成稀疏矩阵,但是随机生成器只生成1s的值,我需要让它生成特定范围内的数字

size_t spare_matrix_generator(int *M, size_t rows, size_t cols)
{
    std::random_device rd;
    std::mt19937 gen(rd());
    gen.seed(time(NULL));

    std::binomial_distribution<int> distribution(1, 0.5);

    size_t NNZ = 0;

    for (szie_t i = 0; i < rows*cols; i++)
    {
        M[i] = distribution(gen);
        std::cout << M[i] << " ";
        if (A[i] != 0)
            NNZ++;
    }
    std::cout << std::endl;

    return NNZ;
}

对于[a,b]中ab-a之间的
std::二项式分布的随机数,并将
a
添加到生成的结果中,以考虑输入范围[a,b]:

size_t spare_matrix_generator(int *M, size_t rows, size_t cols)
{
    std::random_device rd;
    std::mt19937 gen(rd());
    gen.seed(time(NULL));
    int b = 12, a = 3;

    std::binomial_distribution<int> distribution(b-a, 0.5);

    // To handle matrix sparsity
    float zero_prob = 0.8;
    std::mt19937 sparse_gen(rd() + 42);
    std::uniform_real_distribution<double> sparse_dist(0.0,1.0);

    size_t NNZ = 0;

    for (szie_t i = 0; i < rows*cols; i++)
    {
        if(sparse_dist(sparse_gen) > zero_prob){
            M[i] = a + distribution(gen);
        } else {
            M[i] = 0;
        }

        std::cout << M[i] << " ";
        if (M[i] != 0)
            NNZ++;
    }
    std::cout << std::endl;

    return NNZ;
}
大小备用矩阵生成器(int*M,大小行,大小列)
{
std::随机_装置rd;
标准:mt19937 gen(rd());
gen.seed(时间(空));
int b=12,a=3;
标准:二项分布(b-a,0.5);
//处理矩阵稀疏性
浮动零点概率=0.8;
标准:mt19937稀疏_-gen(rd()+42);
标准:均匀实分布稀疏分布(0.0,1.0);
尺寸NNZ=0;
对于(szie_t i=0;i零概率){
M[i]=a+分布(gen);
}否则{
M[i]=0;
}

std::是否可以使用均匀整数分布?是否需要使用二项式分布?或者任何随机生成器都可以做到这一点?我需要它是二项式分布为什么
gen.seed(time(NULL))
当你已经用
随机设备为你的生成器设定种子时
?你就这样撤销了之前的种子,并用一个更糟糕的种子来替换它。@TedLyngmo我在尝试一些东西。它不会影响代码逻辑。在这种情况下,可以忽略它,但矩阵的稀疏性会丢失数据的稀疏性矩阵依赖于某种东西?我用二项式分布的两个参数的许多不同值对代码(我的原始代码)进行了多次测试。我的结论是使用1仅将输出范围限制为1和0。但是选择不同的范围,例如(10-5)将强制生成器生成10到5之间的所有可能数字(即4、3、2、1、5)…因此出现0的可能性(即使其稀疏)将比第一种情况下减少是的,一种解决方案是使用另一个分布来控制矩阵的稀疏性。这样,您可以决定所需非空元素的牵引力。对于这些元素,您可以根据需要生成随机数。现在我理解了您的编辑。谢谢您的回答
size_t spare_matrix_generator(int *M, size_t rows, size_t cols)
{
    std::random_device rd;
    std::mt19937 gen(rd());
    gen.seed(time(NULL));
    int b = 12, a = 3;

    std::binomial_distribution<int> distribution(b-a, 0.5);

    // To handle matrix sparsity
    float zero_prob = 0.8;
    std::mt19937 sparse_gen(rd() + 42);
    std::uniform_real_distribution<double> sparse_dist(0.0,1.0);

    size_t NNZ = 0;

    for (szie_t i = 0; i < rows*cols; i++)
    {
        if(sparse_dist(sparse_gen) > zero_prob){
            M[i] = a + distribution(gen);
        } else {
            M[i] = 0;
        }

        std::cout << M[i] << " ";
        if (M[i] != 0)
            NNZ++;
    }
    std::cout << std::endl;

    return NNZ;
}