有没有办法生成范围很大但趋向于接近 1 的值的随机数? (Java)

Is there a way to generate random numbers with a large range, but tend towards values near 1? (Java)

我正在制作一个神经网络,我有一个变量 weight 乘以某个值。我希望能够随机化 weight 变量并允许它是像 0.1 这样的小数或像 10 这样的大数字。但是 ,我希望它通常更接近于1比没有。

这是我希望随机值看起来像的示例:

0.90.61.50.25.81.11.30.82.6、等等

允许使用 5.8 等值,但大多数都接近 1。

请告诉我这是否可以在 Java 中完成。

非常感谢!

您可以通过为随机化发生器提供比高值更多的低值来做到这一点。设置一个数组来保存您的体重值,低值多于高值。然后随机化器创建一个索引。因为你有更多的低值,所以低值被选中的机会大于高值:

float[] values = new float[5];
values[0] = 0.1f;
values[1] = 0.1f;
values[2] = 0.2f;
values[3] = 0.2f;
values[4] = 10.0f;

随机化器 returns 索引从 0 到 4。0.10.2value 被选中的可能性是 10.0[ 的两倍=15=]

您通过添加比高值更多的低值来调整权重。

听起来你想要一个 Poisson distribution。通常值的分布是离散的,由整数给出,例如0、1、2 等,但您可以将结果除以 10 得到一位小数。

Poisson 运行dom 变量 x 的概率函数由公式给出:

f(x) =(e–λ λx)/x!

Java 没有任何 built-in 来获得泊松分布的 运行dom 变量,但是我们可以得到一个统一的 运行dom 变量 Random.nextDouble().

诀窍是将统一 运行dom 变量映射到泊松 运行dom 变量。

This Q&A over at Math.se 使用数学展示如何通过找到最小泊松 运行dom 变量 [=60 将统一 运行dom 变量映射到泊松 运行dom 变量=]p满足一个条件,其中U是统一的运行dom变量,条件是U 小于或等于作为 p.

函数的累积概率分布

                                                           p

P ≡ min { p = 0, 1, 2, ... | U ≤ exp(-λ) Σ (λp)/p! }

                                                          i=0

这是我使用此方程编写的一些代码,用于将统一 运行dom 变量 urv 转换为泊松 运行dom 变量 p.

public class Test {
    public static void main(String[] args) {
        double lambda = 10.0;
        System.out.println("Test");
        for (int urv100 = 0; urv100 < 100; urv100++) {
            double urv = urv100 / 100.0;
            System.out.println("P(" + lambda + ", " + urv + ") = " + poisson(lambda, urv));
        }
        System.out.println("Converting uniform to Poisson");
        Random rnd = new Random();
        for (int r = 0; r < 100; r++) {
            double urv = rnd.nextDouble();
            System.out.println("urv of " + urv + " mapped to p of " + poisson(lambda, urv) / 10.0);
        }
        System.out.println("urv of 0.999999 mapped to p of " + poisson(lambda, 0.999999) / 10.0);
        System.out.println("urv of 0.999999999999 mapped to p of " + poisson(lambda, 0.999999999999) / 10.0);
        //System.out.println("urv of 0.9999999999999999 mapped to p of " + poisson(lambda, 0.9999999999999999) / 10.0);
    }
    public static int poisson(double lambda, double urv){
        int p = 0;
        while (true) {
            double cumulDistr = cumulDistr(lambda, p);
            //System.out.println("   cumulDistr(" + lambda + ", " + p + ") is " + cumulDistr);
            if (urv <= cumulDistr) {
                return p;
            }
            p++;
        }
    }

    private static double cumulDistr(double lambda, int p) {
        double summation = 0;
        for (int i = 0; i <= p; i++) {
            summation += Math.pow(lambda, i) / fact(i);
        }
        return summation * Math.exp(-lambda);
    }

    private static double fact(int p) {
        double product = 1;
        for (int f = 1; f <= p; f++) {
            product *= f;
        }
        return product;
    }
}

fact方法计算阶乘,cumulDistr方法计算累积泊松分布,poisson方法计算最小值p使得urv 小于或等于累积分布。 lambda 变量是泊松分布的均值。

如果您想要 1.0 的平均值,但离散值以 0.1 为增量,则使 lambda 10 并将结果除以 10

这是我的输出。请注意,虽然 5.8 可能是可能的,但它可能极其罕见。

Test
P(10.0, 0.0) = 0
P(10.0, 0.01) = 3
P(10.0, 0.02) = 4
P(10.0, 0.03) = 5
P(10.0, 0.04) = 5
P(10.0, 0.05) = 5
P(10.0, 0.06) = 5
P(10.0, 0.07) = 6
P(10.0, 0.08) = 6
P(10.0, 0.09) = 6
P(10.0, 0.1) = 6
P(10.0, 0.11) = 6
P(10.0, 0.12) = 6
P(10.0, 0.13) = 6
P(10.0, 0.14) = 7
P(10.0, 0.15) = 7
P(10.0, 0.16) = 7
P(10.0, 0.17) = 7
P(10.0, 0.18) = 7
P(10.0, 0.19) = 7
P(10.0, 0.2) = 7
P(10.0, 0.21) = 7
P(10.0, 0.22) = 7
P(10.0, 0.23) = 8
P(10.0, 0.24) = 8
P(10.0, 0.25) = 8
P(10.0, 0.26) = 8
P(10.0, 0.27) = 8
P(10.0, 0.28) = 8
P(10.0, 0.29) = 8
P(10.0, 0.3) = 8
P(10.0, 0.31) = 8
P(10.0, 0.32) = 8
P(10.0, 0.33) = 8
P(10.0, 0.34) = 9
P(10.0, 0.35) = 9
P(10.0, 0.36) = 9
P(10.0, 0.37) = 9
P(10.0, 0.38) = 9
P(10.0, 0.39) = 9
P(10.0, 0.4) = 9
P(10.0, 0.41) = 9
P(10.0, 0.42) = 9
P(10.0, 0.43) = 9
P(10.0, 0.44) = 9
P(10.0, 0.45) = 9
P(10.0, 0.46) = 10
P(10.0, 0.47) = 10
P(10.0, 0.48) = 10
P(10.0, 0.49) = 10
P(10.0, 0.5) = 10
P(10.0, 0.51) = 10
P(10.0, 0.52) = 10
P(10.0, 0.53) = 10
P(10.0, 0.54) = 10
P(10.0, 0.55) = 10
P(10.0, 0.56) = 10
P(10.0, 0.57) = 10
P(10.0, 0.58) = 10
P(10.0, 0.59) = 11
P(10.0, 0.6) = 11
P(10.0, 0.61) = 11
P(10.0, 0.62) = 11
P(10.0, 0.63) = 11
P(10.0, 0.64) = 11
P(10.0, 0.65) = 11
P(10.0, 0.66) = 11
P(10.0, 0.67) = 11
P(10.0, 0.68) = 11
P(10.0, 0.69) = 11
P(10.0, 0.7) = 12
P(10.0, 0.71) = 12
P(10.0, 0.72) = 12
P(10.0, 0.73) = 12
P(10.0, 0.74) = 12
P(10.0, 0.75) = 12
P(10.0, 0.76) = 12
P(10.0, 0.77) = 12
P(10.0, 0.78) = 12
P(10.0, 0.79) = 12
P(10.0, 0.8) = 13
P(10.0, 0.81) = 13
P(10.0, 0.82) = 13
P(10.0, 0.83) = 13
P(10.0, 0.84) = 13
P(10.0, 0.85) = 13
P(10.0, 0.86) = 13
P(10.0, 0.87) = 14
P(10.0, 0.88) = 14
P(10.0, 0.89) = 14
P(10.0, 0.9) = 14
P(10.0, 0.91) = 14
P(10.0, 0.92) = 15
P(10.0, 0.93) = 15
P(10.0, 0.94) = 15
P(10.0, 0.95) = 15
P(10.0, 0.96) = 16
P(10.0, 0.97) = 16
P(10.0, 0.98) = 17
P(10.0, 0.99) = 18
Converting uniform to Poisson
urv of 0.8288520112341562 mapped to p of 1.3
urv of 0.35446366155650744 mapped to p of 0.9
urv of 0.8340486798727402 mapped to p of 1.3
urv of 0.8858928268763592 mapped to p of 1.4
urv of 0.9026643406946203 mapped to p of 1.4
urv of 0.13960555377413952 mapped to p of 0.7
urv of 0.9195710056013893 mapped to p of 1.5
urv of 0.44998928169297736 mapped to p of 0.9
urv of 0.8793009483663888 mapped to p of 1.4
urv of 0.8591855177365383 mapped to p of 1.3
urv of 0.5205437915100812 mapped to p of 1.0
urv of 0.8703983622023188 mapped to p of 1.4
urv of 0.82075096895357 mapped to p of 1.3
urv of 0.9806363370196562 mapped to p of 1.7
urv of 0.02509517057275079 mapped to p of 0.4
urv of 0.36375516077339465 mapped to p of 0.9
urv of 0.07037727036002717 mapped to p of 0.6
urv of 0.6818190760646871 mapped to p of 1.1
urv of 0.32197145361627577 mapped to p of 0.8
urv of 0.23745234391089698 mapped to p of 0.8
urv of 0.8934052227696372 mapped to p of 1.4
urv of 0.44142256004343283 mapped to p of 0.9
urv of 0.4021584936656427 mapped to p of 0.9
urv of 0.8982224754947559 mapped to p of 1.4
urv of 0.5358391491707077 mapped to p of 1.0
urv of 0.7385630250167211 mapped to p of 1.2
urv of 0.979775968296643 mapped to p of 1.7
urv of 0.22274327853351406 mapped to p of 0.8
urv of 0.07561592409103857 mapped to p of 0.6
urv of 0.06473994682056239 mapped to p of 0.5
urv of 0.5416987364902209 mapped to p of 1.0
urv of 0.4860980118260786 mapped to p of 1.0
urv of 0.9564072685131361 mapped to p of 1.6
urv of 0.19446735227769363 mapped to p of 0.7
urv of 0.7675862499420885 mapped to p of 1.2
urv of 0.4277105215574004 mapped to p of 0.9
urv of 0.8923336944675764 mapped to p of 1.4
urv of 0.9353143574875429 mapped to p of 1.5
urv of 0.5754775563481273 mapped to p of 1.0
urv of 0.449414823264646 mapped to p of 0.9
urv of 0.9109544383075693 mapped to p of 1.4
urv of 0.3837527451770203 mapped to p of 0.9
urv of 0.14283575366272117 mapped to p of 0.7
urv of 0.3866077468484732 mapped to p of 0.9
urv of 0.662249698097005 mapped to p of 1.1
urv of 0.05012298208977162 mapped to p of 0.5
urv of 0.12890274868435359 mapped to p of 0.6
urv of 0.7709717413863731 mapped to p of 1.2
urv of 0.7629124932757383 mapped to p of 1.2
urv of 0.08419512530357443 mapped to p of 0.6
urv of 0.9814512014328213 mapped to p of 1.7
urv of 0.01204516066988126 mapped to p of 0.4
urv of 0.8681197289737762 mapped to p of 1.4
urv of 0.2322137137936654 mapped to p of 0.8
urv of 0.6494975804996993 mapped to p of 1.1
urv of 0.4649550027050112 mapped to p of 1.0
urv of 0.36705272690857005 mapped to p of 0.9
urv of 0.08698141252662916 mapped to p of 0.6
urv of 0.24326648103541826 mapped to p of 0.8
urv of 0.9229172381814946 mapped to p of 1.5
urv of 0.08379005168736153 mapped to p of 0.6
urv of 0.6544487613989808 mapped to p of 1.1
urv of 0.18367321169511808 mapped to p of 0.7
urv of 0.6756484363119853 mapped to p of 1.1
urv of 0.13179611575336148 mapped to p of 0.7
urv of 0.2534425428679633 mapped to p of 0.8
urv of 0.16581779859681034 mapped to p of 0.7
urv of 0.9086216315426554 mapped to p of 1.4
urv of 0.11808111111941566 mapped to p of 0.6
urv of 0.28957878822961225 mapped to p of 0.8
urv of 0.8244607265851857 mapped to p of 1.3
urv of 0.8831380495463445 mapped to p of 1.4
urv of 0.2222095479898628 mapped to p of 0.8
urv of 0.5000703942445024 mapped to p of 1.0
urv of 0.3341765268545145 mapped to p of 0.9
urv of 0.033476169064498684 mapped to p of 0.5
urv of 0.2856853641247886 mapped to p of 0.8
urv of 0.8530540470203735 mapped to p of 1.3
urv of 0.3028587949037277 mapped to p of 0.8
urv of 0.8449176275299684 mapped to p of 1.3
urv of 0.9388444379027909 mapped to p of 1.5
urv of 0.403224473163457 mapped to p of 0.9
urv of 0.22447582249839637 mapped to p of 0.8
urv of 0.13523963178706166 mapped to p of 0.7
urv of 0.9652355645124876 mapped to p of 1.6
urv of 0.05497837319494847 mapped to p of 0.5
urv of 0.44545341748361267 mapped to p of 0.9
urv of 0.15230147439015596 mapped to p of 0.7
urv of 0.5575736794499111 mapped to p of 1.0
urv of 0.3649349046306235 mapped to p of 0.9
urv of 0.06878741747556394 mapped to p of 0.6
urv of 0.7216428916513631 mapped to p of 1.2
urv of 0.8546996873563696 mapped to p of 1.3
urv of 0.22761255830658056 mapped to p of 0.8
urv of 0.47096564927387896 mapped to p of 1.0
urv of 0.5305503681123561 mapped to p of 1.0
urv of 0.1655836111058504 mapped to p of 0.7
urv of 0.5312078242229661 mapped to p of 1.0
urv of 0.1390046501481954 mapped to p of 0.7
urv of 0.5188365074236052 mapped to p of 1.0
urv of 0.999999 mapped to p of 2.8
urv of 0.999999999999 mapped to p of 3.9

请注意,在尝试获得 5.8 时,我尝试了 0.9999999999999999(16 9 十进制数字)。它 运行 一分钟多才被我杀死。对于累积分布值,它必须 运行 与 double 的精度相比较,因此您必须针对这种边缘情况添加某种保护措施。

您可能还想将 lambda 设置为 5.0 并将结果除以 5 以 0.2 为增量的值,这可能会使概率曲线足够宽(偶尔)得到一个 5.8.

您可以从函数 10 - log(x) for x from 1 to e^10 中获取一个值。

这将为您提供从 0 到 10 的值,这些值越低越好。

Random r = new Random();
double max = Math.exp(10);

public double expWeight() {
    return 10 - Math.log(r.nextDouble(1, max));
}

double weight = expWeight();

但是,这也会使小于 1 的数字比 1 的可能性更大,这可能不是您要找的。