大佬教程收集整理的这篇文章主要介绍了C++ uniform_int_distribution离散均匀分布类用法详解,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
std::uniform_int_diStribution<> d; // DiStribution over 0 to max for type int,inclusive std::cout << "Range from 0 to "<< std::numeric_limits<std::uniform_int_diStribution<> :: result_type>::max()<<std::endl; // Range from 0 to 2147483647第一条语句调用默认的构造函数来生成分布对象 d。所有的参数都是默认的,因此生成值的类型是 int,范围从 0 到 int 类型的最大值。最后的注释显示了得到的范围的界限;上边界是 int 类型的最大值,由定义在 limits 头文件中的函数模板 numeric_imits() 生成。获取范围的界限有很多更加简单的方式。可以调用所有分布对象都有的成员函数 min() 和 max():
std::cout <<"Range from " << d.min () << " to " << d.max () << std::endl;在这种情况下,还有另外一种可能。uniform_int_diStribution 类模板定义了成员函数 a() 和 b(),它们可以分别返回范围的下边界和上边界。因此可以将前面的语句这样写:
std::cout << "Range from "<< d.a() << " to " << d.b() << std::endl;成员函数 a() 和 b() 的名称比 min() 和 max() 更能说明它们所返回的值是如何和均勻分布关联的。
std::uniform_int_diStribution<> d {500}; std::cout << "Range from "<< d.a() << " to " << d.b ()<< std::endl; // Range from 500 to 2147483647当然,构造函数的参数也可以是负数。一般来说,需要指定范围的两个边界,这里有几个这样做的实际示例:
std::uniform_int_diStribution<long> dist {-5L,5L}; std::random_device rd; // Non-deterministic seed source std::default_random_ENGIne rng {rd()}; // Create random number generator for(size_t i{}; i < 8; ++i) std::cout << std::setw (2) << dist (rng) << " "; // -3 0 5 1 -2 -4 0 4第一条语句定义了一个用来生成 long 类型随机整数的分布对象。范围从 -5 到 +5,所 以这个分布对象能够返回 11 个可能的值。因此,每个可能值的出现概率为 1/11。通常,对于范围在 [a,b] 内的整数的均匀分布,返回的任何特定值的概率都是 1/(1+b-a)。在本人系统上,所得到的输出如最后一句代码的注释所示,它肯定和在你系统上得到的不一样。
std::uniform_int_diStribution<> dist {0,6}; std::random_device rd; // Non-determinstic seed source std::default_random_ENGIne rng {rd()}; // Create random number generator for(size_t i{}; i < 8; ++i) std::cout << std::setw (3)<< dist (rng) << " "; // first output line std::cout << std::endl; //Save old range and set new range auto old_range = dist.@R_184_1403@; // Get current params dist.param(std::uniform_int_diStribution<>::param_type {-10,20}); for(size_t i{}; i < 8; ++i) std::cout << std::setw (3) << dist (rng) <<" "; // Second output line std::cout << std::endl; // Restore old range... dist.param(old_rangE); for(size_t i {}; i < 8; ++i) std::cout << std::setw(3) << dist(rng) << " ";// Third output line std::cout << std::endl;这段代码的输出如下:
6 1 5 6 1 3 6 2
19 16 15 5 0 7 6 -8
0 0 0 3 2 6 6 5
using Range = std::uniform_int_diStribution<>::param_type;现在可以按如下方式用 @R_184_1403@ 调用来设置新的范围:
dist.param(Range {-10,20});有很多场景能用到修改范围的界限的能力。一个显然的应用是,在一个程序中,当我们需要几个给定类型值的均匀分布时,每一个都需要一套不同的参数。这时候就可以只使用一个分布对象,然后根据需要在程序的任何地方设置参数。
以上是大佬教程为你收集整理的C++ uniform_int_distribution离散均匀分布类用法详解全部内容,希望文章能够帮你解决C++ uniform_int_distribution离散均匀分布类用法详解所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。