Java 比较[-1,+;1]中选择随机数的两种方法

Java 比较[-1,+;1]中选择随机数的两种方法,java,math,random,probability,Java,Math,Random,Probability,我参加了一个在线java课程,并面临以下挑战: 通过模拟将省道投掷到单位正方形上并确定单位圆中省道的分数,计算π的估计值 我关于如何生成随机x坐标的想法是选择[0,1]范围内的两个均匀随机数,然后减去它们。结果值的范围为-1到+1 讲师的答案是将生成的双精度乘以2,再减去1。以下是他们的代码: public class MonteCarlo { public static void main(String[] args) { System.out.println("Number of t

我参加了一个在线java课程,并面临以下挑战:

通过模拟将省道投掷到单位正方形上并确定单位圆中省道的分数,计算π的估计值

我关于如何生成随机x坐标的想法是选择[0,1]范围内的两个均匀随机数,然后减去它们。结果值的范围为-1到+1

讲师的答案是将生成的双精度乘以2,再减去1。以下是他们的代码:

public class MonteCarlo
{
public static void main(String[] args)
{
    System.out.println("Number of tries");
    Random generator = new Random(42);
    Scanner in = new Scanner(System.in);
    int tries = in.nextInt();

    int hits = 0;
    for (int i = 1; i <= tries; i++)
    {
        // Generate two random numbers between -1 and 1

        double x = generator.nextDouble() * 2 -1 ;

        double y = generator.nextDouble() * 2 -1 ;

        // Check whether the point lies in the unit circle

        if (Math.sqrt((x - 0) * (x - 0) + (y - 0) * (y - 0)) <= 1)
        {
            hits++;
        }
    }

    /*
       The ratio hits / tries is approximately the same as the ratio
       circle area / square area = pi / 4
    */

    double piEstimate = 4.0 * hits / tries;
    System.out.println("Estimate for pi: " + piEstimate);
}
}
公共级蒙特卡洛
{
公共静态void main(字符串[]args)
{
System.out.println(“尝试次数”);
随机发生器=新随机(42);
扫描仪输入=新扫描仪(系统输入);
int trys=in.nextInt();
int hits=0;

对于(int i=1;i这实际上是一个数学问题,而不是一个编程问题。您的目标是对[-1,1]范围内的一致随机实数进行采样,您有两种方法:

  • 对[0,1]范围内的实数进行采样,将其乘以2,然后减去1

  • 对[0,1]范围内的两个实数进行均匀采样,然后减去它们

  • 方法(1)工作正常。方法(2)不正确。与其解释范围[0,1],不如让我们想象一下,你想要通过滚动两个公平骰子并从第二个骰子中减去第一个骰子来选择-5和+5之间的随机数。即使每个骰子滚动都是公平的,并且一致地从{1,2,3,4,5,6}中选择某个,结果分布不均匀。例如:

    • 得到-5的几率是三十六分之一,因为只有一种可能的方法:你必须在第一个骰子上滚一个1,在第二个骰子上滚六
    • 获得0的几率是六分之一,因为有六个不同的卷产生0(1/1、2/2、3/3、4/4、5/5和6/6)
    同样的数学论点解释了为什么减去两个均匀随机数不会得到你想要的范围内的均匀随机分布。相反,你会得到一个三角形分布,它在0处达到峰值,并随着你朝+1和-1方向下降


    换言之,你得到的是一个随机数——这并不等于以相同的概率向单位平方投掷飞镖。

    同样的原因是,增加两个骰子并不等于缩放一个骰子,而不是向我们提供指导老师的答案并解释为什么它是正确的,我认为你最好向我们提供你的答案回答并让我们解释为什么它是错误的。你的方法不会将值平均分布在-1和1之间。你的讲师的方法会。