第九章 循环结构和random库,蒙特卡罗方法

1.遍历循环
for <循环变量> in <遍历结构>:
<语句块>
它的应用,计数循环,变量i可以使用,也可以不使用
for i in range(n):
<语句块>
字符串遍历循环:
for c in s:
<语句块>
列表遍历循环:
for item in ls:
<语句块>
还能对文件,字典,元祖等各种数据结构进行遍历循环。

2.无限循环
while <条件>:
<语句块>

s="python"
while s !="":
    for c in s:
        print(c,end="")
    s=s[:-1]

while循环一次,输出当前字符串,并把字符串s截掉最后一个字符

3.循环扩展
for <循环变量> in <遍历结构>:
<语句块1>
else:
<语句块2>

while <条件>:
<语句块1>
else:
<语句块2>
含义:当循环没有被break语句退出时,执行else语句块,类似把else当作“正常”完成循环的奖励,设计它的目的在于可以让程序员判断,在循环中的break有没有起效果。


random库,是使用随机数的python标准库
基本随机数函数: seed() , random()
扩展随机数函数: randint(), getrandbits(), uniform(), randrange(), choice(), shuffle()
核心就一个random()产生随机数,其他7个都是为了使用方便,在此基础上扩展而来。

给定一个具体的随机数种子seed(),经过梅森旋转算法,计算机就能产生一系列的伪随机数。
只要种子相同,产生的随机序列,序列中无论是每一个元素的值,还是它出现的位置都相同。

random.seed(10)

如果不给seed指定值,它会使用系统时间作为种子,去产生随机序列。
这两种方式各有优缺点,给定种子,当程序再次运行时,产生的随机数也相同。
那么它能够复现,重现程序运行的过程。
如果不给种子,系统时间(精确到微秒)就很难再现,当程序再次运行时,就无法重现随机运行过程。

random.seed()

random()生成一个[0.0, 1.0]之间的随机小数
这里写图片描述
randint()并非直接把产生的随机小数直接乘以100,否则结果该为57
这里写图片描述
只要种子相同,产生的顺序和大小一样
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
种子的影响随时随地:
这里写图片描述
从0到29的数字里随机选择一个,只要种子一样,程序再次运行,选择的结果相同。


这里写图片描述
随机去撒点,只要撒点的数量足够多,撒点的总量就构成了正方形和圆形的面积。

from random import random
from time import perf_counter
DARTS=1000*1000
hits=0.0
start=perf_counter()
for i in range(1,DARTS+1):
    x,y=random(),random()
    dist=pow(x**2+y**2,0.5)
    if dist<=1.0:
        hits=hits+1
pi=4*(hits/DARTS)
print('圆周率为:',pi)
print('消耗时间为:{:.5f}秒'.format(perf_counter()-start))

x,y去模拟撒点的坐标,然后通过dist计算点到圆心的距离,小于1.0说明落在圆内,hits+1
这里写图片描述
整个过程并没有用到任何公式,意义在于很多问题并没有一个公式,那就可以使用蒙特卡罗方法近似计算。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值