使用 std::binomial_distribution 在范围之间生成随机数
Generate random numbers between range using std::binomial_distribution
我创建了一个函数来生成稀疏矩阵,但是随机生成器只生成1 的值,我需要让它生成特定范围内的数字。
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;
}
假设5x5矩阵,上述函数的示例输出如下所示:
0 1 1 0 0
1 0 0 0 1
0 0 0 1 0
1 0 0 0 1
0 0 0 0 1
对于 [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;
}
相关文章:
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- C++ 中的类之间的数据重新循环 - 错误:'<class name>'未在此范围内声明
- 类型大小与其值范围之间的关系?
- 使用 std::binomial_distribution 在范围之间生成随机数
- 重命名两个目录中的文件名,如果它们之间的某些字符匹配 - 矢量下标超出范围
- 为什么Valgrind-Massif和最高内存消耗之间会有不同的范围
- 范围V3.两个范围之间的区别
- 我正在尝试创建一个程序,用户在其中输入一系列数字,并且我想列出范围之间的质数
- 给定范围之间有多少个素数?C++
- 在基于范围的 for 循环中,& 和 && 之间有什么区别?
- 变量超出C++类之间的范围
- 在可能重叠的范围之间复制类
- BOOST_FOREACH 和 c++11 之间基于范围的循环的区别
- 范围和封装之间的区别是什么?(C++)
- 固定范围的随机数介于100和149之间(包括100和149)
- 由于在序列点之间修改变量两次而导致的 UB 是否会转移到"inner"范围?
- 检查一对值是否位于范围数组中的范围之间
- 两个范围之间的随机数
- 将范围之间的字符串向量转换为带分隔符的字符串(允许增强)
- 当m和n在10^10范围内相当大时,使用埃拉托色尼筛法打印m和n之间的素数