首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一定范围内生成随机数,其中一定百分比为特定值。

在一定范围内生成随机数,其中一定百分比为特定值。
EN

Stack Overflow用户
提问于 2019-12-08 01:48:00
回答 1查看 57关注 0票数 0

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

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

另一个问题:我应该测试一个图形的大小来查看性能差异?10个顶点?100个?1000个? 10000000?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-08 02:01:04

C++提供了discrete_distributionuniform_int_distribution类,它们一起实现了您想要的结果。一个例子如下:

代码语言:javascript
复制
#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;
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59231787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档