C++中的半随机数生成

Semi-random numbers generation in C++

本文关键字:随机数 C++      更新时间:2023-10-16

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

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

#include <iostream>
#include <random>
int main()
{
    using namespace std;
    mt19937_64 engine;
    discrete_distribution<int> numbers{4, 1, 2, 1};
    cout << numbers(engine) << endl;
}

快速方法:

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];