std :: minstd_rand的范围是什么?

时间:2018-09-15 18:58:26

标签: c++ random

在标头<random>中,有一个名为std::minstd_rand的引擎。

此引擎的界限是包含或排除的随机数吗?它具有minmax函数,但是我特别想知道随机模拟是否可以等于minmax,而不是仅仅受它们的限制。

文档中使用“之间”一词,这当然不是明确的。

2 个答案:

答案 0 :(得分:2)

  

t具有minmax函数,但是我特别想知道随机模拟是否可以等于minmax

是的

来自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.。足以击中minmax

最后回答问题

  

此引擎的界限是包含还是排除的随机数?

我不知道。这取决于。而且我不知道是否有人证明无论种子如何,您最终总是会为min生成器点击maxstd::minstd_rand……但这更多是一个数学交换问题。