随机数,非均匀分布

时间:2012-11-07 22:40:03

标签: java random

  

可能重复:
  Generate random number with non-uniform density

我尝试识别/创建一个函数(在Java中),它给出了一个非均匀分布的数字序列。 如果我有一个说function f(x), and x>0的函数,它会给我一个随机数 从0x

此功能最适用于任何给定的x,以下仅为我想要的示例。

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

我希望例如说

0 to 20约为所有案例的20%。

21 to 50约为所有案例的50%。

51 to 70约为所有案例的20%。

71 to 100约占所有案例的10个。

简而言之,给我一个像正态分布一样的数字,在这种情况下它是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);
}

5 个答案:

答案 0 :(得分:4)

一个简单的解决方案是生成0到9之间的第一个随机数。

0表示10个百分比,1表示10个百分比,等等。

因此,如果得到0或1,则生成0到20之间的第二个随机数。如果得到2,3,4,5或6,则生成21到50之间的第二个随机数等。

答案 1 :(得分:2)

你能写一个函数,将1-X范围内的一些随机数加起来并取平均值吗?当n增加时,这将趋于正态分布

请参阅:

Generate random numbers following a normal distribution in 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

答案 2 :(得分:0)

一种解决方案是在1-100之间做一个随机数,并根据结果在适当的范围内做另一个随机数。

1-20 - &gt; 0-20

21-70 - &gt; 21-50

71-90 - &gt; 51-70

91-100 - &gt; 71-100

希望这是有道理的。

答案 3 :(得分:0)

您需要先创建f(x)。

假设值x是等概率的,则f(x)是

double f(x){
if(x<=20){
 return x;
}else if (x>20 && x<=70){
 return (x-20)/50*30+20;
} else if(...

答案 4 :(得分:0)

只需生成一堆,比如至少30,0和x之间的均匀随机数。然后采取那些意思。在中心极限定理之后,平均值将是来自以x / 2为中心的正态分布的随机数。