std::d iscrete_distributed of a 指定范围的随机数
std::discrete_distribution of a specified range of random numbers
我知道我可以像这样使用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
整除。
相关文章:
- 在一定范围内生成随机数,其中一定百分比为特定值
- 在一定范围内C++生成随机数
- 使用 std::binomial_distribution 在范围之间生成随机数
- 从大范围内生成一个随机数,但从大范围的中间开始生成较小的范围
- std::d iscrete_distributed of a 指定范围的随机数
- 如何在范围内生成随机数
- 用具有不同范围的均匀分布的随机数填充多维矩阵
- 将范围随机数保存到数组而不重复的函数
- 如何在特定范围和总和中生成随机数
- 具有从特定范围的随机数初始化特征矩阵或向量初始化特征矩阵或向量的有效方法
- 随机数生成器与范围?C
- 在一定范围内生成随机数
- 如何使用Linux GetRandom系统调用来在范围内生成一个随机数
- 如何在由C++中的负值和正值组成的范围内生成随机数
- c++随机数生成器,允许用户选择范围
- 从一个特定的范围中生成一定数量的唯一随机数
- 十进制 在包括负数的范围内生成随机数
- 定义和播种具有全局范围的伪随机数生成器(C++)
- C++生成范围内服从正态分布的随机数
- mt19937 随机数范围 - 奇怪的输出 00A8106E