C ++中的半随机数生成

时间:2014-04-23 15:00:08

标签: c++ random

假设我有一组数字x = {0,0,0,0,1,2,2,3}。有没有办法让我使用rand()打印出这个列表中的随机数,这样生成的数字在一段时间内的比例实际上就是该集合中数字的原始比例?换句话说,所以零的比例约为0.5,其中1比0.125,twos为0.25,三分为0.125。

2 个答案:

答案 0 :(得分:3)

您可以通过指定频率来实现:

#include <iostream>
#include <random>

int main()
{
    using namespace std;
    mt19937_64 engine;

    discrete_distribution<int> numbers{4, 1, 2, 1};

    cout << numbers(engine) << endl;
}

答案 1 :(得分:2)

快速方法:

int values[8] = { 0, 0, 0, 0, 1, 2, 2, 3 };
int randomIndex = rand() % 8; // NOTE: feel free to replace with & 0x7
int randomValue = values[randomIndex];

注意:提供均匀分布的数值应为2(2,4,8,16等)的功率。如果您需要其他号码,可以使用以下内容:

int rand_range(int maxValue)
{
    int mask = 0;
    int tmp = maxValue;
    int r;

    while (tmp > 0)
    {
        mask = (mask << 1) | 1;
        tmp= (tmp>> 1);
    }

    r = rand() & mask;
    while (r > maxValue)
        r = rand() & mask;

    return r;
}

int values[XXXX] = { 0, 0, 0, 0, 1, 2, 2, 3, ... };
int randomIndex = rand_range(XXXX-1); // NOTE: -1 as maxValue is inclusive
int randomValue = values[randomIndex];