随机但很可能1浮动

时间:2016-02-06 05:23:08

标签: java math random

我想随机化一个浮动,以便

  • 有95%的机会约为1
  • 有0.01%的几率成为< 0.1或> 1.9
  • 永远不会变成0或2

例如,多次使用layout可以实现这一点吗?

概率的直观说明:

A visual illustration of the probability

2 个答案:

答案 0 :(得分:7)

您需要找到一个 f 函数,以便:

  1. f是连续的并且在[0,1]

  2. 上增加
  3. f(0)> 0和f(1)< 2

  4. f(0.01)&gt; = 0.1且f(0.99)<= 1.9

  5. f(x)是&#34;约1&#34;对于0.025 <= x <= 0.975

  6. 然后只需f(Random.nextDouble())

    例如,Math.tan(3*(x-0.5))/14.11适合这种情况,所以对于你的表达我会使用:

    Math.tan(3*(Random.nextDouble()-0.5))/14.11
    

    概率分布如下:

    Wolfram cloud session

答案 1 :(得分:2)

我不用 JAVA 编码,但无论如何,如果我想使用内部伪随机生成器(我通常使用不同的方法),我会这样做:

  1. <强>解释

    我们假设我们有伪随机生成器Random.nextFloat()返回范围<0,1>中的值,并且分布均匀。

  2. 从统一<0,1>创建映射到您的(0,2)

    这将是:

    mapping

    0.001应该是0.0001 !!! 我在绘制时教它是0.1%而不是0.01%......

    我们称之为f(x)。它可以是一个表(分段插值),或构造一个与你需要的属性匹配的多项式( BEZIER ,插值多项式,......)

    正如您所见,x轴是概率,y轴是伪随机值(在您的范围内)。由于内置的​​伪随机生成器是统一的,它们将在<0,1>之间生成均匀分布的数字,可以直接用作x

    要避免0.02.0将它们丢弃或使用<0.0+ulp,2.0-ulp> value=f(Random.nextFloat()); {/ 1>}

    图形在Paint中绘制,由2x立方 BEZIER (每立方4个控制点)和一条线组成。

  3. 现在只需转换范围

    所以你的伪随机值将是:

    Lastname
  4. <强> [注释]

    对于定点格式数字,这会更好,否则你需要使曲率非常高,以产生任何效果或使用非常大的数据量来匹配所需的概率输出。