首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有左右偏差的Bell曲线

具有左右偏差的Bell曲线
EN

Stack Overflow用户
提问于 2016-01-05 07:46:23
回答 2查看 692关注 0票数 3

在Java中,我想生成一个从1到100的随机数,这个随机数可以根据比例的任何一端来做,同时仍然有机会从另一端得到一个数字,但仍然是“滚动”的。

为了澄清,在一个正常的情况下,在许多卷1-100的平均将是50,但在某些情况下,我希望平均值向下移动,说,25%。,但仍然有机会100%被产生。

我看过Random.nextGaussian,它确实改变了钟形曲线,但是对于一个低端值,这消除了高端的可能性。

我应该使用什么公式或公式的组合?

移位

EN

回答 2

Stack Overflow用户

发布于 2016-01-05 07:53:03

  1. 计算出您想要的分发的确切形式。
  2. 计算该分布的分位数函数。
  3. 使用适当的生成器在[0,1)中画一个均匀的随机数。
  4. 这是分位数函数的输入。

得到的数字将根据您的需要分发。

票数 4
EN

Stack Overflow用户

发布于 2022-08-25 00:47:58

想出一些简单的方法至少能得到这样的结果。我没能理解这一切背后的数学原因,所以我大部分时间都是尝试和错误的,当我得到一些看起来足够好的东西时,我就说了一天。

发现了两种方法:

  1. 基本上创建三角分布,然后用简单的指数法调整它的值。它的形状类似于钟形曲线,但它在峰值处有一个尖峰,而不是一个单调的尖峰。通过改变指数,曲线接近峰值既可以是凹形曲线,也可以是凸型曲线。

/** * @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);}

  1. 第二种方法是接受高斯分布,并根据需要压缩/拉伸。

/** * @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只是一个值范围重映射函数。

代码语言:javascript
复制
    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.randomRandomDataGenerator

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34606566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档