Maple:RNG不是随机的

时间:2015-03-03 11:30:32

标签: maple prng lcg

我是"找到Pi"使用蒙特卡罗方法,但答案是不正确的。原始代码是:

RandomTools[MersenneTwister]: with(Statistics):

tries := 10000:

s := 0; 
for i to tries do 
    if GenerateFloat()^2+GenerateFloat()^2 < 1 then s := s+1 end if; 
end do: 
evalf(4*s/tries)

它给出的回答是2.8-2.85

当我将代码更改为

s := 0; 
x := Array([seq(GenerateFloat(), i = 1 .. tries)]); 
y := Array([seq(GenerateFloat(), i = 1 .. tries)]); 
for i to tries do 
if x[i]^2+y[i]^2 < 1 then s := s+1 end if;
end do:
evalf(4*s/tries)

然后答案是正确的。我不知道为什么我不能在&#34;中生成数字?循环。

我发现它的意思是相同的,但方差是不同的。 为:

tries := 100000; 
A := Array([seq(GenerateFloat(), i = 1 .. 2*tries)]); 
s1 := Array([seq(A[i]^2+A[tries+i]^2, i = 1 .. tries)]); 
Mean(s1); 
Variance(s1);
s2 := Array([seq(GenerateFloat()^2+GenerateFloat()^2, i = 1 .. tries)]);
Mean(s2); 
Variance(s2);

输出是:

0.6702112097021581
0.17845439723457215
0.664707674135025
0.35463131700965245

它有什么问题? GenerateFloat()应尽可能统一。

1 个答案:

答案 0 :(得分:7)

自动简化正在转变你的,

GenerateFloat()^2+GenerateFloat()^2

成,

2*GenerateFloat()^2

在评估GenerateFloat()之前。

让它按预期工作的一个简单改变就是将它们分开。例如,

restart:
with(RandomTools[MersenneTwister]):
tries := 10^4:
s := 0:
for i to tries do
  t1,t2 := GenerateFloat(),GenerateFloat();
  if t1^2+t2^2 < 1 then s := s+1 end if;
end do:
evalf(4*s/tries);

另一种方法是使用略微不同的结构,不会自动简化。考虑一下,单右引号(不引用引号)不会停止自动简化(如果需要,这是术语的定义)。

'f()^2 + f()^2';                                                
                                     2
                                2 f()

但以下内容并未自动简化,

a:=1:
'f()^2 + a*f()^2';
                                2        2
                             f()  + a f()

因此,另一个简单的解决方法是,

restart:
with(RandomTools[MersenneTwister]):
tries := 10^4:
s := 0:
a := 1;
for i to tries do
  if GenerateFloat()^2 + a*GenerateFloat()^2 < 1 then s := s+1 end if;
end do:
evalf(4*s/tries);