Mathematica,42 40 39字节(或31/29?)
我有42个字节的所有三个解决方案:
4Count[1~RandomReal~{#,2},p_/;Norm@p<1]/#&
4Tr@Ceiling[1-Norm/@1~RandomReal~{#,2}]/#&
4Tr@Round[1.5-Norm/@1~RandomReal~{#,2}]/#&
它们都是未命名的函数,它们使用样本数,并且n
返回有理近似值π。首先,它们都n
在正象限的单位正方形中生成点。然后,他们确定位于单位圆内的那些样本的数量,然后除以样本数量,然后乘以4
。唯一的区别在于它们如何确定单位圆内的样本数量:
- 第一个使用
Count
条件为Norm[p] < 1
。
- 第二个从中减去每个点的范数,
1
然后四舍五入。这会将单位圆内的数字变为,将单位圆1
外的数字变为0
。之后,我将它们全部加起来Tr
。
- 第三个基本相同,但从中减去
1.5
,因此我可以使用Round
代替Ceiling
。
Aaaaaand 在撰写本文时,我想到确实存在一个较短的解决方案,如果我只是减去2
然后使用Floor
:
4Tr@Floor[2-Norm/@1~RandomReal~{#,2}]/#&
或使用Unicode地板或天花板操作员保存另一个字节:
4Tr@⌊2-Norm/@1~RandomReal~{#,2}⌋/#&
4Tr@⌈1-Norm/@1~RandomReal~{#,2}⌉/#&
请注意,对于相同的字节,也可以使用Mean
代替Tr
和不使用编写三个基于舍入的解决方案/#
。
如果其他基于蒙特卡洛的方法很好(特别是彼得选择的方法),我可以通过使用的来估计或的整数来完成31个字节,这一次给出了一个浮点数:√(1-x2)
1/(1+x2)
4Mean@Sqrt[1-1~RandomReal~#^2]&
Mean[4/(1+1~RandomReal~#^2)]&