改变获得随机数的概率

use*_*967 7 c++ random

我想生成0到3之间的随机数,我的代码中有以下内容:

int random = rand() % 4;
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我希望它在大多数时间生成1,2和3,偶尔生成0.

最好的方法是什么?解决此问题的常用算法有哪些名称?

Mys*_*ial 16

这是一种方式.假设您希望0,1,2,3的分布分别为5%,20%,30%,45%.
你可以这样做:

double val = (double)rand() / RAND_MAX;

int random;
if (val < 0.05)       //  5%
    random = 0;
else if (val < 0.25)  //  5% + 20%
    random = 1;
else if (val < 0.55)  //  5% + 20% + 30%
    random = 2;
else
    random = 3;
Run Code Online (Sandbox Code Playgroud)

当然,不必使用浮点数.我这样做是因为它更直观.


Ben*_*ley 7

您可以使用随机库中的discrete_distribution类.

#include <iostream>
#include <random>
#include <ctime>

int main()
{
    std::discrete_distribution<> dist({ 1.0, 4.0, 4.0, 4.0 });  
    std::mt19937 eng(std::time(0));
    for (int i=0; i<100; ++i)
        std::cout << dist(eng);
}
Run Code Online (Sandbox Code Playgroud)

演示:http://ideone.com/z8bq4

如果你不能使用C++ 11,这些类也存在于boost中.