Java Random. next高斯函数介于0和1之间

k5ifujac  于 2022-11-20  发布在  Java
关注(0)|答案(3)|浏览(134)

我正在做一个图像编辑器,我打算实现过滤器。我决定用一些模糊或噪音。
无论如何,我决定我想要一个统一的过滤器,所以我读了关于Random.nextGaussian()
但是,由于我使用的RGB值范围从0到255,我如何缩放这个随机双精度值以适应0到255之间的范围?
我相信nextGaussian()返回的随机值的范围可以从-1到1。
所以,我想保留随机值之间的相对差异。“缩放”或“移动数字范围”如果有意义的话。
我知道这是可能的,但我想不出来。提前感谢。
实际上,我需要它是一个介于0和1之间的数字。

u1ehiz5o

u1ehiz5o1#

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

  • Gaussian* 分布是一种分布,其范围覆盖双精度值的整个集合(从数学上讲,从负无穷大正无穷大),峰值在零附近。因此,Gaussian 分布不均匀

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;

这种算法在big-oh分析中速度并不快,但它节省了更昂贵的nextDouble方法调用以及浮点乘法和浮点到整型的转换。

2skhul33

2skhul332#

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

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

mec1mxoz3#

您可以通过调整平均值和标准差来拟合~[0,1]之间的正态(高斯)分布。例如,使用mean = 0.5,std = 0.15,您将以99.91%的总概率得到介于[0,1]之间的值。最终,您可以确保值严格介于[0,1]之间。

Supplier<Double> alphaSupplier = new Supplier<Double>() {
        
        @Override
        public Double get() {
            double value = new Random().nextGaussian() * 0.15 + 0.5;
            return Math.max(0, Math.min(1, value));
        }
    };
    
double random value = alphaSupplier.get();

相关问题