如何实现非随机的随机数生成器?

6 .net c# random algorithm

我需要一个随机数生成器,它在n和m之间产生不同的数字,但是没有相同的概率.我想在n和m之间设置一个值x,其中可能性最高:

在此输入图像描述

使用Random类有一种简单的方法吗?可能性应该具有二项式分布的形式或类似的东西(它的确切二项式分布并不重要,粗略近似也可以)

编辑

也许我必须澄清一下:我不是在寻找二分法或高斯分布,而是为了这样的事情: 在此输入图像描述

我想定义值x应该是最高可能性的值.

编辑

不幸的是,之前接受的答案似乎并不适用我怀疑的方式.所以我还在寻找答案!

Mar*_*ers 6

您可以使用Box-Muller变换从一系列数字生成一系列伪随机正态分布数,这些数字在0和1之间均匀分布.

Box-Muller变换


Dew*_*wfy 5

Java SDK具有良好的实现Random.nextGaussian(取自http://download.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#nextGaussian())

我希望很清楚如何从java源解析为c#

synchronized public double nextGaussian() {
    if (haveNextNextGaussian) {
            haveNextNextGaussian = false;
            return nextNextGaussian;
    } else {
            double v1, v2, s;
            do { 
                    v1 = 2 * nextDouble() - 1;   // between -1.0 and 1.0
                    v2 = 2 * nextDouble() - 1;   // between -1.0 and 1.0
                    s = v1 * v1 + v2 * v2;
            } while (s >= 1 || s == 0);
            double multiplier = Math.sqrt(-2 * Math.log(s)/s);
            nextNextGaussian = v2 * multiplier;
            haveNextNextGaussian = true;
            return v1 * multiplier;
    }
 }
Run Code Online (Sandbox Code Playgroud)

更新:我如何改变中位数:

public static float gaussianInRange(float from, float mean, float to)
{
    if( !(from < mean && mean < to) )
        throw new IllegalArgumentException(MessageFormat.format("RandomRange.gaussianInRange({0}, {1}, {2})", from, mean, to));

    int p = _staticRndGen.nextInt(100);
    float retval;
    if (p < (mean*Math.abs(from - to)))
    {
        double interval1 = (_staticRndGen.nextGaussian() * (mean - from));
        retval = from + (float) (interval1);
    }
    else
    {
        double interval2 = (_staticRndGen.nextGaussian() * (to - mean));
        retval = mean + (float) (interval2);
    }
    while (retval < from || retval > to)
    {
        if (retval < from)
            retval = (from - retval) + from;
        if (retval > to)
            retval = to - (retval - to);
    }
    return retval;
}
Run Code Online (Sandbox Code Playgroud)