Weighted random numbers

前端 未结 6 748
情书的邮戳
情书的邮戳 2020-11-22 08:50

I\'m trying to implement a weighted random numbers. I\'m currently just banging my head against the wall and cannot figure this out.

In my project (Hold\'em hand-ran

6条回答
  •  伪装坚强ぢ
    2020-11-22 08:58

    Updated answer to an old question. You can easily do this in C++11 with just the std::lib:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main()
    {
        // Set up distribution
        double interval[] = {1,   2,   3,   4};
        double weights[] =  {  .90, .56, .04};
        std::piecewise_constant_distribution<> dist(std::begin(interval),
                                                    std::end(interval),
                                                    std::begin(weights));
        // Choose generator
        std::mt19937 gen(std::time(0));  // seed as wanted
        // Demonstrate with N randomly generated numbers
        const unsigned N = 1000000;
        // Collect number of times each random number is generated
        double avg[std::extent::value] = {0};
        for (unsigned i = 0; i < N; ++i)
        {
            // Generate random number using gen, distributed according to dist
            unsigned r = static_cast(dist(gen));
            // Sanity check
            assert(interval[0] <= r && r <= *(std::end(interval)-2));
            // Save r for statistical test of distribution
            avg[r - 1]++;
        }
        // Compute averages for distribution
        for (double* i = std::begin(avg); i < std::end(avg); ++i)
            *i /= N;
        // Display distribution
        for (unsigned i = 1; i <= std::extent::value; ++i)
            std::cout << "avg[" << i << "] = " << avg[i-1] << '\n';
    }
    

    Output on my system:

    avg[1] = 0.600115
    avg[2] = 0.373341
    avg[3] = 0.026544
    

    Note that most of the code above is devoted to just displaying and analyzing the output. The actual generation is just a few lines of code. The output demonstrates that the requested "probabilities" have been obtained. You have to divide the requested output by 1.5 since that is what the requests add up to.

提交回复
热议问题