【问题描述】
假设有一个单位圆,其面积就是π,
单位圆的外接正方形的边长为2,故正方形的面积是4
在正方形内随机产生m个点,假设落在圆内的点的数量为n,则n/m近似等于圆与正方形的面积比
也就是n/m=π/4,据此可以求出π的近似值
要求,
m的值在运行时通过input输入
随机数种子设为100,也就是在for循环之前使用如下语句
random.seed(100)
提示: 产生[-1,1]之间的随机小数可以用random库的uniform函数
【输入形式】整数
【输出形式】保留3位小数
【样例输入】
10000
【样例输出】
3.140
【解题思路】
我们可以虚拟一个场景,在x-y直角坐标系中有一个边长为2,中心再原点的正方形,内部有一个内切单位圆。
那么我们以这个正方形为界限,在正方形内部随机生成坐标点(x,y),计算点到圆心(坐标原点(0,0))的距离 len, 通过与圆半径1作比较是否在在圆内,若在圆内部则n的数值+1。
需要注意的是:
- 因为选择(0,0)作为坐标原点,那么随机数的生成范围是【-1,1】,uniform(a,b)函数的作用是生成【a,b】之间的随机浮点数。
- 关于随机数种子,真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的。但是计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的。
而随机数种子 seed( ) 用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed( )值,则每次生成的随即数都相同(一个种子值对应一个随机数序列),如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
【Python代码】
import random
m =int(input())
n =0
random.seed(100)for i inrange(m):
x = random.uniform(-1,1)
y = random.uniform(-1,1)len=pow(x**2+y**2,0.5)iflen<1:
n +=1
pi =4*(n/m)print("%.3f"%pi)
版权归原作者 猫小乐_ 所有, 如有侵权,请联系我们删除。