我尝试识别/创建一个函数(在Java中),它给出了一个非均匀分布的数字序列。
如果我有一个说function f(x), and x>0
的函数,它会给我一个随机数
从0
到x
。
此功能最适用于任何给定的x
,以下仅为我想要的示例。
但是,如果我们说x=100
,则函数f(x)
将返回非分布式的分布。
我希望例如说
0 to 20
约为所有案例的20%。
21 to 50
约为所有案例的50%。
51 to 70
约为所有案例的20%。
71 to 100
约占所有案例的10个。
简而言之,给我一个像正态分布一样的数字,在这种情况下它是30-40,x
是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);
}
答案 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班轮
答案 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为中心的正态分布的随机数。