c++ - 生成一个范围内的随机数,其中的百分比为特定值

标签 c++ algorithm random graph-algorithm

我需要创建大型(请参阅下文的详细信息)随机图来比较 Dijkstra、Bellman-Ford 和 Floyd 算法在最短路径图遍历方面的性能。我将邻接存储在一个数组中。到目前为止,我在顶点之间生成了随机权重,并用 0 填充了主对角线。我也有关于主对角线的对称性(我假设图形是无向的但不一定完全连接)。

随机值在 0 - 24 左右的范围内,使用 rand() % 25 生成。问题是我希望图表更稀疏(即边缘更少)。有没有一种方法可以生成一个范围内的随机数,并且生成的数字中大约有 1/3 到 1/2 是特定值?请注意,随机分布对于我正在做的事情并不是很重要...

另一个问题:我应该测试多大的图表才能看到性能差异? 10个顶点? 100? 1000? 10000000?

最佳答案

C++ 提供了 discrete_distributionuniform_int_distribution 类,它们共同实现了您想要的。示例如下:

#include <random>
#include <iostream>

template<typename rgen>
int custom_random_int(rgen& mt) {
    // Returns 0 at a 1/3 chance, 1 at a 2/3 chance
    std::discrete_distribution<> d({1, 2});
    // Uniform distribution of integers in [0, 24]
    std::uniform_int_distribution<> ud(0, 24);
    if (d(mt) == 0) {
      // Return 0 at 1/3 chance
      return 0;
    } else {
      // Output a random number at 2/3 chance
      return ud(mt);
    }
}

int main() {
    // Fixed seed of 1 for demonstration purposes
    std::seed_seq ss{ 1 };
    std::mt19937 mt(ss);
    for(int i = 0; i < 100; i++) {
           std::cout << custom_random_int(mt) << std::endl;
    }
}

关于c++ - 生成一个范围内的随机数,其中的百分比为特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59231787/

相关文章:

c++ - 将 RAII 结构作为二维数组传递给函数

algorithm - 二叉树到DLL转换的时间复杂度

c# - 随机不是那么随机

Java Random() 四舍五入

c++ - 使用什么类型的智能指针创建界面?

C++多写点流

c++ - 我应该如何在我的类中实现字符串的静态集合

python - 元胞自动机算法似乎不起作用

python - 实现动态多时间线队列

c# - 强大的随机数生成