Biased Random Number Generator

前端 未结 10 468
春和景丽
春和景丽 2020-12-09 12:41

I am looking for a random number generator that can be biased. For instance, say I want a random number between 1-5, with the probability being:

1: Comes up 20% of t

10条回答
  •  一向
    一向 (楼主)
    2020-12-09 13:36

    Coming late to the party on this one. Here is the C++0x answer:

    #include 
    #include 
    #include 
    
    int main()
    {
        // Set up distribution
        double interval[] = {1,   2,   3,   4,   5,   6};
        double weights[] = {  .2,   .1,  .4,  .25, .05};
        std::piecewise_constant_distribution<> dist(std::begin(interval),
                                                    std::end(interval),
                                                    std::begin(weights));
        // Choose generator
        std::mt19937 gen;  // seed as wanted
        // Demonstrate by pouring into avg[rand-1]
        const unsigned N = 1000000;
        double avg[sizeof(weights) / sizeof(weights[0])] = {0};
        for (unsigned i = 0; i < N; ++i)
            avg[static_cast(dist(gen)) - 1]++;
        // Comute averages
        for (double* i = std::begin(avg); i < std::end(avg); ++i)
            *i /= N;
        // Display
        for (unsigned i = 1; i <= sizeof(avg)/sizeof(avg[0]); ++i)
            std::cout << "avg[" << i << "] = " << avg[i-1] << '\n';
    }
    

    Which for me outputs:

    avg[1] = 0.199779
    avg[2] = 0.100002
    avg[3] = 0.400111
    avg[4] = 0.250257
    avg[5] = 0.049851
    

提交回复
热议问题