C++ 生成具有给定分布的字符

C++ 生成具有给定分布的字符,c++,distribution,C++,Distribution,我有两个关于用给定分布生成数字/单个字符的问题 如何在C++中实现拉普拉斯分布?我知道它在boost库中可用,但假设我不能使用它。而且,我在c+11的标准库中没有看到它 如果我必须生成具有正态分布的字符文本,将生成的双精度数字转换为int,然后转换为char类型是否会奏效 std::default_random_engine generator; std::normal_distribution<double> distribution(112.0,5.0); int number

我有两个关于用给定分布生成数字/单个字符的问题

如何在C++中实现拉普拉斯分布?我知道它在boost库中可用,但假设我不能使用它。而且,我在c+11的标准库中没有看到它
  • 如果我必须生成具有正态分布的字符文本,将生成的双精度数字转换为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;
    
    std::默认随机引擎生成器;
    标准:正态分布(112.0,5.0);
    整数=(整数)分配(发电机);
    //a-z字符
    如果(number>=97&&number1)拉普拉斯分布具有显式密度(请参阅),这是一个从$\mathbf{R}$到$[0,1]$的函数,带有参数,因此可以在
    c++
    中实现为类的成员函数,例如,该类的成员变量将包括分布的参数。例如:

    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
            }
    
    };
    
    给你一张照片

    2) 至于正态分布,正态随机变量的值为$\mathbf{R}$,它们的分布也是如此。如果我是你,我宁愿用二元随机变量对给定均值和方差的正态随机变量进行离散近似,而不是将
    double
    s转换为
    int
    。(例如)粗略地说,如果你想看到正态分布,你的
    char
    s的数量会趋于无穷大吗。这正是前面提到的二项式近似的目的

    更准确地说:考虑$B(n,p)$分布(维基百科符号对我们有共同点)。当n收敛到$+\infty$时,$B(n,p)$趋于正态分布$n(np,np(1-p))$。你,你得到了正态分布的平均值m和方差v,你的
    char
    s必须被分配为。所以m=np和v=np(1-p)。由于B(n,p)的值在集合{0,…,n}中,并且您的
    char
    s span{97,…,122}={0,…,25}+97(+表示转换),因此取n=25。这导致p=m/25和v=m*(1-m/25)。因此,您将用{0,…,25}中的值模拟B(m/25,m*(1-m/25)),并对{0,…,25}中生成的每一个
    int
    添加97,您将
    static\u cast
    这个int来获得相应的
    char

    在这一点上,剩下的是用之前建立的n和p的值来模拟B(n,p)。为此,请随意使用:


    虽然我完全赞成使用二项式字母抽样(你可能也会考虑泊松,但我认为方差有点不合适)

    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;
    }
    
    std::默认随机引擎生成器;
    双模板
    样品拉普拉斯(双mu、双b、发电机和发电机){
    标准:均匀实分布rng(0.0,1.0);
    双x=-std::log(1.0-rng(生成器))*b;
    if(rng(发电机)<0.5)
    x=-x;
    返回x+mu;
    }
    
    为什么不创建从
    'a'
    'Z'
    的正态分布(或它们的小写等价物)?请注意,它仅适用于ASCII或其他字母连续编码的编码。您在那里尝试过吗?你的解决方案有什么问题?如果你不能使用Boost.org的解决方案,为什么你认为你可以使用StackOverflow.com的解决方案?许可证没什么不同。谢谢你的回复。2.我将使用二项分布。它也在标准库中实现,因此将更加容易。1.如何将其与
    std::default\u random\u引擎生成器一起使用?或者其他函数,这样我可以生成类似于此
    分布(生成器)的随机字符?我还想用它来生成给定范围内的字符。我想唯一的方法是先将其转换为int,然后再转换为char类型?我将编辑我的答案,使其包含您的评论问题的答案。再次感谢。然而,我的意思是你对我的第一个问题的回答:P.我如何使用你给出的LaplaceRandomVariable类生成具有Laplace分布的字符/整数。我想实现类似于
    分发(生成器)的功能由标准库提供。有可能吗?嗯,你有[0,1]中数值的均匀分布生成器,不是吗?你们有逆累积分布函数F的显式公式,所以你们知道如何用初等概率理论来模拟拉普拉斯分布,对吗?我之前的评论对你们有意义吗?