答案 0 :(得分:7)
您需要找到一个 f 函数,以便:
答案 1 :(得分:2)
我不用 JAVA 编码,但无论如何,如果我想使用内部伪随机生成器(我通常使用不同的方法),我会这样做:
<强>解释强>
我们假设我们有伪随机生成器Random.nextFloat()
返回范围<0,1>
中的值,并且分布均匀。
从统一<0,1>
创建映射到您的(0,2)
这将是:
0.001应该是0.0001 !!! 我在绘制时教它是0.1%而不是0.01%......
我们称之为f(x)
。它可以是一个表(分段插值),或构造一个与你需要的属性匹配的多项式( BEZIER ,插值多项式,......)
正如您所见,x
轴是概率,y
轴是伪随机值(在您的范围内)。由于内置的伪随机生成器是统一的,它们将在<0,1>
之间生成均匀分布的数字,可以直接用作x
。
要避免0.0
和2.0
将它们丢弃或使用<0.0+ulp,2.0-ulp>
value=f(Random.nextFloat());
{/ 1>}
图形在Paint中绘制,由2x立方 BEZIER (每立方4个控制点)和一条线组成。
现在只需转换范围
所以你的伪随机值将是:
Lastname
<强> [注释] 强>
对于定点格式数字,这会更好,否则你需要使曲率非常高,以产生任何效果或使用非常大的数据量来匹配所需的概率输出。