我试图识别/创建一个函数(在Java中),该函数给我一个非均匀的分布式数字序列。如果我有一个函数说它function f(x), andx>0将给我一个从0到的随机数x。
function f(x), andx>0
0
x
该函数最适合任何给定的函数x,下面仅是我想要的示例。
但是,如果我们说x=100函数f(x)将返回来自分布式的s nonuni。
x=100
f(x)
我想例如说
0 to 20 约占所有案件的20%。
0 to 20
21 to 50 大约是所有情况的50%。
21 to 50
51 to 70 约占所有案件的20%。
51 to 70
71 to 100大约是所有情况的10。
71 to 100
总之somting,给我一个数字,如正态分布,并在30-40偷看在这种情况下x是100。
100
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); }
您能编写一个将多个随机数相加后得出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