std::d iscrete_distributed of a 指定范围的随机数

std::discrete_distribution of a specified range of random numbers

本文关键字:范围 随机数 of iscrete distributed std      更新时间:2023-10-16

我知道我可以像这样使用std::discrete_distribution

std::default_random_engine generator;
std::discrete_distribution<int> distribution {2,2,1,1,2,2,1,1,2,2};
int p[10]={};
for (int i=0; i<100; ++i) {
    int number = distribution(generator);
    ++p[number];
}

但是,这将根据指定的权重生成 0-9 范围内的数字。

我可以做些什么来生成用户指定范围内的数字,例如 24-33 或 95-104 等,但仍使用 discrete_distribution 中指定的分布?

您只需在

生成的数字上添加 24 或 95。一开始你有从 0 到 9 的数字,当你将 24 加到它们时,你有从 24 到 33 的数字。

当你有一个函数返回范围[r1,r2)的随机数时,并且你希望[min,max)数学提供帮助。

首先我们计算d=(max-min)/(r2-r1),然后将[r1,r2)的范围乘以 d,这样我们得到[d*r1,d*r2)我们将[r1',r2'),现在你计算diff=abs(min-r1)'并将其相加到范围[r1',r2'),我们使用abs,因为我们想要没有符号的差异,并且我的朋友会得到你想要的范围, 让我们假设在范围[r1,r2)中返回的函数somerand()然后:

const int r1=0,r2=9
int myrand(const int min,const int max){
    const int d=(max-min)/(r2-r1);
    const int localrand=d*somerand();
    return localrand + abs(min - d*r1);
}

您可以检查函数在somerand()返回r1时是否返回min,以及当函数返回somerand()返回r2时是否返回max

上面的解决方案不适用于例如:r1=0,r2=2,min=0,max=3,简而言之max-min应该能被r2-r1整除。