小编典典

随机数,分布不均匀

java

我试图识别/创建一个函数(在Java中),该函数给我一个非均匀的分布式数字序列。如果我有一个函数说它function f(x), andx>0将给我一个从0到的随机数x

该函数最适合任何给定的函数x,下面仅是我想要的示例。

但是,如果我们说x=100函数f(x)将返回来自分布式的s nonuni。

我想例如说

0 to 20 约占所有案件的20%。

21 to 50 大约是所有情况的50%。

51 to 70 约占所有案件的20%。

71 to 100大约是所有情况的10。

总之somting,给我一个数字,如正态分布,并在30-40偷看在这种情况下x100

http://en.wikipedia.org/wiki/Normal_distribution

(如果需要,我可以使用统一的随机gen作为得分,并且只有一个将从统一结果转换为非均匀结果的函数。)

编辑

我对此问题的最终解决方案是:

/**
 * Return a value from [0,1] and mean as 0.3, It give 10% of it is lower
 * then 0.1. 5% is higher then 0.8 and 30% is in rang 0.25 to 0.45
 *
 * @return
 */
public double nextMyGaussian() {
    double d = -1000;
    while (d < -1.5) {
        // RANDOMis Java's normal Random() class.
        // The nextGaussian is normal give a value from -5 to +5?
        d = RANDOM.nextGaussian() * 1.5;
    }
    if (d > 3.5d) {
        return 1;
    }
    return ((d + 1.5) / 5);
}

阅读 372

收藏
2020-11-26

共1个答案

小编典典

您能编写一个将多个随机数相加后得出1-X范围并取平均值的函数吗?随着n的增加,这将趋于正态分布

看到:

在C / C ++中遵循正态分布生成随机数

我入侵了以下内容:

class CrudeDistribution {

    final int TRIALS = 20;

    public int getAverageFromDistribution(int upperLimit) {
        return getAverageOfRandomTrials(TRIALS, upperLimit);
    }

    private int getAverageOfRandomTrials(int trials, int upperLimit) {
        double d = 0.0;
        for (int i=0; i<trials; i++) {
            d +=getRandom(upperLimit);
        }
        return (int) (d /= trials);
    }

    private int getRandom(int upperLimit) {
        return (int) (Math.random()*upperLimit)+1;
    }
}

Commons-Math中有一些库可以根据均值和标准差(用于衡量价差)生成分布。在链接中,一些算法可以做到这一点。

寻找相关的2班轮大概是一个有趣的小时:

https://commons.apache.org/math/userguide/distribution.html

2020-11-26