我正在使用图像编辑器,我即将实施过滤器。我决定采取某种模糊或噪音。
无论如何,我决定要一个统一的过滤器,所以我读了Random.nextGaussian()
。
但是,由于我使用的RGB值范围为0到255.如何缩放此随机双精度值以适应0和255?
nextGaussian()返回的随机值范围从-1到1我相信。
所以,我想保留随机值之间的相对差异。 "刻度"或者"移动数字范围"如果这是有道理的。
我知道这是可能的,但我无法弄清楚。提前谢谢。
基本上,我需要它是介于0和1之间的数字。
答案 0 :(得分:2)
在这种情况下,您应该使用nextDouble()
。
高斯分布是一个分布,范围超过整个双值集合(从数学上讲,从减去无穷大到正无穷大),峰值在零附近。因此高斯分布不均匀。
nextDouble()
方法在0
和1
之间抽取数字统一(包括0
,排除1
。
您可以使用以下代码在0
和255
(包括两者)之间随机抽取数字:
Random rand = new Random();
int value = (int) math.floor(256.0*rand.nextDouble());
然而,更快的算法会屏蔽随机整数(Random.nextInt
):
Random rand = new Random();
int value = rand.nextInt()&0xff;
这种算法在big-oh分析中并不快,但它节省了一个更昂贵的nextDouble
方法调用以及浮点乘法和浮点到int转换。
答案 1 :(得分:0)
您可以将 nextGaussian() 与 Math.abs() 一起使用,以便您可以获得高斯分布的正值。
Random random = new Random();
double positiveRandomValue = Math.abs(random.nextGaussian());