我有两个关于使用给定分布生成数字/单个字符的问题。
如果我必须生成具有正态分布的字符文本,将生成的双数转换为int,然后转换为char类型吗?
std::default_random_engine generator;
std::normal_distribution<double> distribution(112.0,5.0);
int number = (int)distribution(generator);
// a-z characters
if(number >= 97 && number <= 122) return (char)number;
else generate once again;
希望得到你的帮助。
答案 0 :(得分:1)
1)拉普拉斯分布具有明确的密度(参见here),这是一个函数,从$ \ mathbf {R} $到$ [0,1] $,带有参数,因此您可以在{ {1}}作为类的成员函数,其成员变量例如包括分布的参数。有点像:
c++
给你一张照片。
2)对于正态分布,正态随机变量的值在$ \ mathbf {R} $中,它们的分布也是如此。不是将class LaplaceRandomVariable
{
double _b;
double _mu;
public:
LaplaceRandomVariable(double b, double mu)
{
_b = b;
_mu = mu;
}
double Distribution(double x) const
{
return (0.5 / _b) * exp(-abs(x - _mu) / _b); //you'll need error checking for _b could be zero
}
};
转换为double
,而是我,我宁愿使用二元随机变量给定均值和方差的正态随机变量的离散近似。 (例如,参见this。)粗略地说,您希望看到正态分布,int
s的数量是否趋于无穷大。这恰恰是上述二项式近似的原因。
更确切地说:考虑$ B(n,p)$分布(维基百科的符号让我们有一个共同点)。当n收敛到$ + \ infty $时,$ B(n,p)$倾向于接近正态分布$ N(np,np(1-p))$。您,您将获得正常分布的均值m和方差v,您的char
必须分配为。所以m = np和v = np(1-p)。由于B(n,p)与集合{0,...,n}中的值和char
s跨度{97,...,122} = {0,...,25} +97(+表示平移),你将取n = 25.这导致p = m / 25和v = m *(1-m / 25)。因此,您将模拟B(m / 25,m *(1-m / 25)),其值为{0,...,25},以及{0,...中每个生成的char
。 。,25}你将添加97,你将int
这个int来获得相应的static_cast<char>
。
此时剩下的是用先前建立的n和p值来模拟B(n,p)。为此,请随意使用:
http://www.cplusplus.com/reference/random/binomial_distribution/
答案 1 :(得分:0)
虽然我全都使用二项式进行字母采样(你也可以看看泊松,但我认为方差有点偏差)
Wrt拉普拉斯分布,它可以用c ++ 11标准件构建
std::default_random_engine generator;
template <typename gen> double
sample_laplace(double mu, double b, gen& generator) {
std::uniform_real_distribution<double> rng(0.0, 1.0);
double x = -std::log(1.0 - rng(generator)) * b;
if (rng(generator) < 0.5)
x = -x;
return x + mu;
}