我参加了一个在线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);
}
}
我的问题是,我的导师的方法和方法有何不同?我的想法有用吗?
答案 0 :(得分:3)
这实际上是一个数学问题,而不是一个编程问题。你的目标是在[-1,1]范围内对一个随机实数进行采样,你有两种方法可以做到这一点:
在[0,1]范围内采样实数,乘以2,然后减去1。
均匀地在[0,1]范围内采样两个实数,然后减去它们。
方法(1)正常工作。方法(2)没有。我们不应该为范围[0,1]解释它,而是想要通过滚动两个公平骰子并从第二个骰子中减去第一个骰子来选择-5到+5之间的随机数。即使每个模具辊都是公平的并且均匀地从{1,2,3,4,5,6}中挑选出一些东西,但所得到的分布并不均匀。例如:
同样的数学类型的论证可以解释为什么减去两个均匀随机数不会在你想要的范围内给出均匀随机分布。相反,你会得到一个三角形的分布,当你走向+1和-1时,它的峰值为0,然后逐渐下降。
所以换句话说,你得到一个随机数 - 它只不等于在单位正方形上投掷飞镖的概率相等。