【问题标题】:Java Random.nextGaussian between 0 and 1Java Random.nextGaussian 介于 0 和 1 之间
【发布时间】:2015-02-20 15:28:08
【问题描述】:

我正在开发图像编辑器,并且即将实现过滤器。我决定使用某种模糊或噪点。

无论如何,我决定我想要一个统一的过滤器,所以我阅读了Random.nextGaussian()

但是,由于我使用 0 到 255 范围内的 RGB 值。如何缩放这个随机双精度值以适应 0 到 255?

nextGaussian() 返回的随机值我相信的范围是-1到1。

所以,我想保留随机值之间的相对差异。如果有意义的话,“缩放”或“移动数字范围”。

我知道这是可能的,但我想不通。提前致谢。

基本上,我需要它是一个介于 0 和 1 之间的数字。

【问题讨论】:

  • 问这个问题的原因是否与混合高斯模糊和高斯分布有关?高斯分布的整个点包含“所有值”(峰值在 0 附近,如答案中所述)

标签: java random gaussian


【解决方案1】:

您可以将 nextGaussian() 与 Math.abs() 一起使用,以便获得高斯分布的正值。

Random random = new Random();
double positiveRandomValue = Math.abs(random.nextGaussian());

【讨论】:

  • 嗨@MerveKaymak,不确定您是否看到了另一个“已接受”的答案(来自 6 年前),它也指出了有关分发的一些重要内容。
【解决方案2】:

在这种情况下,您应该使用nextDouble()

高斯分布是一种分布在double值的整个集合(从数学上讲,从负无穷正无穷大),峰值在零附近。 高斯分布因此不均匀

nextDouble() 方法在01(包括0,不包括1)之间均匀 绘制数字。

因此,您可以使用以下代码在0255(包括两者)之间随机抽取一个数字:

Random rand = new Random();
int value = (int) math.floor(256.0*rand.nextDouble());

然而,一种更快的算法是屏蔽一个随机整数 (Random.nextInt):

Random rand = new Random();
int value = rand.nextInt()&0xff;

此算法在大哦分析中并不快,但它节省了一个更昂贵的 nextDouble 方法调用以及浮点乘法和浮点到整数的转换。

【讨论】:

  • 投射到int 已经相当于Math.floor()
  • @Phylogenesis:是的,但大多数编译器无论如何都会对此进行优化,并且代码在语义上更具可读性(因为不知道值如何四舍五入的人仍然可以理解它)。
猜你喜欢
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
相关资源
最近更新 更多