📌  相关文章
📜  C++中的std :: uniform_int_distribution类

📅  最后修改于: 2021-05-06 19:36:30             🧑  作者: Mango

在概率中,离散均匀分布函数是指某个范围内离散值具有恒定概率的分布,而该范围外具有零概率的分布。对于区间[a,b]中均匀离散分布的概率密度函数P(x)对于范围[a,b]中的离散值是恒定的,否则为零。在数学上,该函数定义为:

     \[ f(x) =  \begin{cases} \frac{1}{b-a}, & a\leq x \leq b\\ 0, & \text{otherwise}\\ \end{cases} \]

C++在随机库中引入了unique_int_distribution类,该类的成员函数给出具有给定概率的给定输入范围内的随机整数或离散值。

Uniform_int_distribution类中的公共成员函数:

  1. 运算符():此函数返回给定分布范围内的随机数。从该函数获得任何数字的概率是相同的。 Operator()函数需要恒定的时间来生成。

    例子:

    // C++ code to demonstrate the working of
    // operator() function
      
    #include 
      
    // for uniform_int_distribution function
    #include 
      
    using namespace std;
      
    int main()
    {
        // Here default_random_engine object
        // is used as source of randomness
        // We can give seed also to default_random_engine
        // if psuedorandom numbers are required
        default_random_engine generator;
      
        int a = 0, b = 9;
      
        // Initializing of uniform_int_distribution class
        uniform_int_distribution distribution(a, b);
      
        // number of experiments
        const int num_of_exp = 10000;
      
        int n = b - a + 1;
        int p[n] = {};
        for (int i = 0; i < num_of_exp; ++i) {
      
            // using operator() function
            // to give random values
            int number = distribution(generator);
            ++p[number];
        }
      
        cout << "Expected probability: "
             << float(1) / float(n) << endl;
      
        cout << "uniform_int_distribution ("
             << a << ", " << b << ")" << endl;
      
        // Displaying the probability of each number
        // after generating values 10000 times.
        for (int i = 0; i < n; ++i)
            cout << a + i << ": "
                 << (float)p[i] / (float)(num_of_exp)
                 << endl;
      
        return 0;
    }
    
    输出:
    Expected probability: 0.1
    uniform_int_distribution (0, 9)
    0: 0.0993
    1: 0.1007
    2: 0.0998
    3: 0.0958
    4: 0.1001
    5: 0.1049
    6: 0.0989
    7: 0.0963
    8: 0.1026
    9: 0.1016
    

    我们可以从输出中观察到,从随机数获得的每个数字的概率都非常接近于计算出的概率。

  2. a():返回range的下限参数。这指定了其成员运算符()可能返回的值范围的下限。
  3. b():返回range的较高参数。这指定了其成员运算符()可能返回的值范围的上限。
  4. max():此函数返回运算符()函数可能的最小输出上限。
  5. min():此函数返回运算符()函数可能的最大可能输出下限。
  6. reset():此函数重置分配,以便后续分配不依赖于先前生成的数字。

例子:

// C++ code to demonstrate the working of
// a(), b(), min(), max(), reset() function
  
#include 
  
// for uniform_int_distribution function
#include 
  
using namespace std;
  
int main()
{
    int a = 10, b = 100;
  
    // Initializing of uniform_int_distribution class
    uniform_int_distribution distribution(a, b);
  
    // Using a() and b()
    cout << "Lower Bound"
         << " " << distribution.a() << endl;
    cout << "Upper Bound"
         << " " << distribution.b() << endl;
  
    // Using min() and max()
    cout << "Minimum possible output"
         << " " << distribution.min() << endl;
    cout << "Maximum possible output"
         << " " << distribution.max() << endl;
  
    // Using reset()
    distribution.reset();
    return 0;
}
输出:
Lower Bound 10
Upper Bound 100
Minimum possible output 10
Maximum possible output 100

参考: https //en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution