在Java中,我想生成一个从1到100的随机数,这个随机数可以根据比例的任何一端来做,同时仍然有机会从另一端得到一个数字,但仍然是“滚动”的。
为了澄清,在一个正常的情况下,在许多卷1-100的平均将是50,但在某些情况下,我希望平均值向下移动,说,25%。,但仍然有机会100%被产生。
我看过Random.nextGaussian,它确实改变了钟形曲线,但是对于一个低端值,这消除了高端的可能性。
我应该使用什么公式或公式的组合?

发布于 2016-01-05 07:53:03
得到的数字将根据您的需要分发。
发布于 2022-08-25 00:47:58
想出一些简单的方法至少能得到这样的结果。我没能理解这一切背后的数学原因,所以我大部分时间都是尝试和错误的,当我得到一些看起来足够好的东西时,我就说了一天。
发现了两种方法:

/** * @param min下限* @param max上界* @param avg模式< min,max> * @param exp凸(0,0.5>或凹<0.5,1>或线性(0.5) */公共静态双triangleExponential(双min,双最大值,双avg,双exp) { if (min >= max _x_x max) {抛新IllegalArgumentException();}双轴轴= MathUtils.range( avg,min,max,0,1);双x= generator.nextUniform(0,1);双nx;if (x <枢轴){ nx = MathUtils.range(x,0,枢轴,0,1);nx = Math.pow( nx,exp);nx = MathUtils.range( nx,0,1,0,枢轴t);}MathUtils.range{nx= MathUtils.range(x,枢轴,1,0,1);nx=1-Math.pow(nx,exp);nx = MathUtils.range(nx,0,1,枢轴,1);}返回MathUtils.range(nx,0,1,min,max);}

/** * @param min下限* @param max上界* @param avg模式< min,max> * @param exp‘峰值锐度’(0,2> */公共静态双squishedGaussian(double min,double max,double avg,double exp) ){ if (min >= max _x max) {抛新IllegalArgumentException();}双枢轴= MathUtils.range( avg,min,max,0,1);双重制服= generator.nextUniform(0,1);双x= generateGaussian();if (均匀<枢轴){x= Math.pow(x,exp);x= MathUtils.range(x,0,1,0,枢轴);}MathUtils.range{x=1- (Math.pow(x,exp);x= MathUtils.range(x,0,1,枢轴,1);}返回MathUtils.range(x,0,1,min,max);}静态双generateGaussian() { double gaussianMax = 5;//它更类似于5.4双兰特;do { rand = Math.abs(generator.nextGaussian(0,1));} while (rand > gaussianMax);返回1-MathUtils.range(rand,0,gaussianMax,0,1);
MathUtils.range只是一个值范围重映射函数。
public static double range(double OldValue, double OldMin, double OldMax, double NewMin, double NewMax) {
return (((OldValue - OldMin) * (NewMax - NewMin)) / (OldMax - OldMin)) + NewMin;
}generator是来自org.apache.commons.math3.random的RandomDataGenerator类
https://stackoverflow.com/questions/34606566
复制相似问题