在标头<random>
中,有一个名为std::minstd_rand
的引擎。
此引擎的界限是包含或排除的随机数吗?它具有min
和max
函数,但是我特别想知道随机模拟是否可以等于min
或max
,而不是仅仅受它们的限制。>
文档中使用“之间”一词,这当然不是明确的。
答案 0 :(得分:2)
t具有
min
和max
函数,但是我特别想知道随机模拟是否可以等于min
或max
。
是的
来自https://en.cppreference.com/w/cpp/numeric/random/linear_congruential_engine#Characteristics(重点是我):
min [static]
获得输出范围内的最小可能值 (公共静态成员函数)
max [static]
在输出范围内获得可能的最大值 (公共静态成员函数)
答案 1 :(得分:2)
我认为我们可以更精确一些。
如您所见,std::minstd_rand
确实是std::linear_congruential_engine<std::uint_fast32_t, 48271, 0, 2147483647>
,因此是我的共同回答者的重点。
要简单地检查生成器是否确实可以产生min() max()
返回的值,我们可以使用这个更简单的生成器。
std::linear_congruential_engine<std::uint_fast32_t, 3, 0, 5>
如果我们测试
#include <random>
#include <iostream>
int main()
{
std::linear_congruential_engine<std::uint_fast32_t, 3, 0, 5> gen;
std::cout << (std::uint_fast32_t) std::linear_congruential_engine<std::uint_fast32_t, 3, 0, 5>::min() << std::endl;
std::cout << (std::uint_fast32_t) std::linear_congruential_engine<std::uint_fast32_t, 3, 0, 5>::max() << std::endl<< std::endl;
gen.seed(1);
for (int i = 0; i < 5; i++)
{
std::cout << gen() << std::endl;
}
std::cout << std::endl;
return 0;
}
我们得到
1
4
3
4
2
1
3
如您所见,发电机确实达到了最小值和最大值。所以
min [static]在输出范围(公共静态成员函数)中获得最小的值
max [static]在输出范围(公共静态成员函数)中获得最大的可能值。
生成器遵循此规则https://en.wikipedia.org/wiki/Linear_congruential_generator。
因此,基本上min()返回1
,而max()返回m-1
。没有比这更聪明的了。
如果我使用另一个发电机std::linear_congruential_engine<std::uint_fast32_t, 3, 0, 6>
并测试
#include <random>
#include <iostream>
int main()
{
std::linear_congruential_engine<std::uint_fast32_t, 3, 0, 6> gen;
std::cout << (std::uint_fast32_t) std::linear_congruential_engine<std::uint_fast32_t, 3, 0, 6>::min() << std::endl;
std::cout << (std::uint_fast32_t) std::linear_congruential_engine<std::uint_fast32_t, 3, 0, 6>::max() << std::endl << std::endl;
for (int s = 0; s < 6; s++)
{
gen.seed(1);
for (int i = 0; i < 5; i++)
{
std::cout << gen() << " ";
}
std::cout << std::endl;
}
return 0;
}
输出为
1
5
3 3 3 3 3
3 3 3 3 3
3 3 3 3 3
3 3 3 3 3
3 3 3 3 3
3 3 3 3 3
无论种子是什么,输出始终为3.。足以击中min
和max
最后回答问题
此引擎的界限是包含还是排除的随机数?
我不知道。这取决于。而且我不知道是否有人证明无论种子如何,您最终总是会为min
生成器点击max
和std::minstd_rand
……但这更多是一个数学交换问题。