从标题<random>
,有一个名为std::minstd_rand
的引擎。
此引擎的边界是随机数是包含还是排他?它有min
和max
函数,但我特别想知道随机模拟是否可以等于min
或max
,而不是仅仅受它们限制。
文档使用“之间”一词,这当然不是明确的。
它有qazxsw poi和qazxsw poi函数,但我特别想知道随机模拟是否可以等于
min
或max
。
是。
来自min
(强调我的):
max
获取输出范围中可能的最小值(公共静态成员函数)
https://en.cppreference.com/w/cpp/numeric/random/linear_congruential_engine#Characteristics
获取输出范围中的最大可能值(公共静态成员函数)
我认为我们可以更准确一点。
你可以看到min [static]
真的是max [static]
,因此我的合作伙伴的重点。
为了简单地检查生成器确实可以产生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>
正如你所看到的那样,发电机确实击中了最小值和最大值。所以
min [静态]获取输出范围中可能的最小值(公共静态成员函数)
max [static]获取输出范围中可能的最大值(公共静态成员函数)
发电机遵循这条规则#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;
}
。所以基本上min()返回1
4
3
4
2
1
3
,max()返回https://en.wikipedia.org/wiki/Linear_congruential_generator。没有比这更聪明的了。
如果我采取另一台发电机1
并测试它
m-1
输出是
std::linear_congruential_engine<std::uint_fast32_t, 3, 0, 6>
无论什么种子,输出总是3.如此多的击中#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
最后回答这个问题
此引擎的边界是随机数是包含还是排他?
我不知道。这取决于。而且我不知道是否有人曾证明无论种子如何,你最终总是为min
发电机击中max
和min
......但这更像是一个mathexchange问题......