Python超详细分步解析随机漫步


Posted in Python onMarch 17, 2022

创建RandomWalk类

为模拟随机漫步,我们将创建一个RandomWalk类,随机选择前进方向,这个类有三个属性,一个存储随机漫步的次数,另外两个存储随机漫步的每个点的x,y坐标,每次漫步都从点(0,0)出发

from random import choice

class RandomWalk():
    '''一个生成随机漫步数据的类'''
    def __init__(self,num_points=5000):
        '''初始化随机漫步的属性'''
        self.num_points = num_points

        # 所有随机漫步都始于(0,0)
        self.x_values = [0]
        self.y_values = [0]

选择方向

我们将使用fill_walk()来生成随机漫步包含的点,并决定每次漫步的方向。并将其添加到random_walk.py中 改正代码如下:

from random import choice


class RandomWalk():
    '''一个生成随机漫步数据的类'''

    def __init__(self, num_points=5000):
        '''初始化随机漫步的属性'''
        self.num_points = num_points

        # 所有随机漫步都始于(0,0)
        self.x_values = [0]
        self.y_values = [0]

    def fill_walk(self):
        '''计算随机漫步包含的所有点'''

        # 不断漫步,知道列表到达指定的长度
        while len(self.x_values) < self.num_points:
            # 决定前进方向以及沿这个方向前进的距离
            x_direction = choice([1, -1])
            x_distance = choice([0, 1, 2, 3, 4])
            x_step = x_direction * x_distance

            y_direction = choice([1, -1])
            y_distance = choice([0, 1, 2, 3, 4])
            y_step = y_direction * y_distance

            # 拒绝原地漫步
            if x_step == 0 and y_step == 0:
                continue

            # 计算下一个点的x,y值
            next_x = self.x_values[-1] + x_step
            next_y = self.y_values[-1] + y_step

            self.x_values.append(next_x)
            self.y_values.append(next_y)

绘制随机漫步图

下面的代码将随机漫步的所有点都绘制出来,将文件命名为rw_visual.py

import matplotlib.pyplot as plt

from random_walk import RandomWalk
# 创建一个RandomWalk实例,并将其包含的点都绘制出来
rw = RandomWalk()
rw.fill_walk()
plt.scatter(rw.x_values, rw.y_values, s=10)
plt.show()

模拟多次随机漫步

每次随机漫步都不同,因此每次生成的各种模式也很有趣,要在不多次运行程序的情况下,进行随机漫步,可以把代码放入一个while循环中,每次关闭matplotlib查看器,系统会询问你是否再次模拟随机漫步(输入y将再次进行随机漫步,输入n将结束程序) 改进代码如下:

import matplotlib.pyplot as plt

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断模拟随机漫步
while True:
    # 创建一个RandomWalk实例,并将其包含的点都绘制出来
    rw = RandomWalk()
    rw.fill_walk()
    plt.scatter(rw.x_values, rw.y_values, s=10)
    plt.show()

    keep_running = input("make another walk? (y/n):")
    if keep_running.upper() == 'N':
        break

每次随机漫步都不同,就如人的一生每走一步都会有不同的经历???

Python超详细分步解析随机漫步

给点着色

使用颜色映射指出漫步中各点的先后顺序,并删除每个点的黑色轮廓,让颜色更明显。将参数c设置为points_numbers,指定使用颜色映射Blues,并传递实参edgecolor=none以删除每个点周围的轮廓,随机漫步图会从浅蓝色渐变到深蓝色,代码如下:

import matplotlib.pyplot as plt

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断模拟随机漫步
while True:
    # 创建一个RandomWalk实例,并将其包含的点都绘制出来
    rw = RandomWalk()
    rw.fill_walk()
    point_numbers = list(range(rw.num_points))
    plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors='none', s=10)
    plt.show()

    keep_running = input("make another walk? (y/n):")
    if keep_running.upper() == 'N':
        break

效果如下:

Python超详细分步解析随机漫步

突出起点和终点

还可以呈现出随机漫步的起点和终点,我们让起点和终点变得更大,并显示为不同的颜色,代码如下:

import matplotlib.pyplot as plt

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断模拟随机漫步
while True:
    # 创建一个RandomWalk实例,并将其包含的点都绘制出来
    rw = RandomWalk()
    rw.fill_walk()
    point_numbers = list(range(rw.num_points))
    plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors='none', s=10)
    # 突出起点和重点
    plt.scatter(0, 0, c='green', edgecolors='none', s=100)
    plt.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none', s=100)
    plt.show()

    keep_running = input("make another walk? (y/n):")
    if keep_running.upper() == 'N':
        break

效果如下:

Python超详细分步解析随机漫步

增加点数

增加点数,以提供更多的数据,我们在创建RandomWalk实例时增大num_points的值,并在绘图时改变每个点的大小,代码如下:

import matplotlib.pyplot as plt

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断模拟随机漫步
while True:
    # 创建一个RandomWalk实例,并将其包含的点都绘制出来
    rw = RandomWalk(50000)
    rw.fill_walk()
    point_numbers = list(range(rw.num_points))
    plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors='none', s=1)
    # 突出起点和重点
    plt.scatter(0, 0, c='green', edgecolors='none', s=100)
    plt.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none', s=100)
    plt.show()

    keep_running = input("make another walk? (y/n):")
    if keep_running.upper() == 'N':
        break

效果如下:

Python超详细分步解析随机漫步

调整尺寸以适用屏幕

图表适合屏幕大小时,更能有效地将数据中的规律呈现出来。函数figure()用于指定图表的宽度、高度、分辨率和背景色。需要给形参figsize指定一个元组,向matplotlib指出绘图窗口的尺寸(单位为英寸) 如果你知道自己的系统分辨率,可使用形参dpi像figure()传递该分辨率,以有效利用可用的屏幕空间代码如下:

import matplotlib.pyplot as plt

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断模拟随机漫步
while True:
    # 创建一个RandomWalk实例,并将其包含的点都绘制出来
    rw = RandomWalk(50000)
    rw.fill_walk()
    # 设置绘图窗口的大小
    plt.figure(dpi=128, figsize=(10, 6))
    point_numbers = list(range(rw.num_points))
    plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors='none', s=1)
    # 突出起点和重点
    plt.scatter(0, 0, c='green', edgecolors='none', s=100)
    plt.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none', s=100)
    plt.show()

    keep_running = input("make another walk? (y/n):")
    if keep_running.upper() == 'N':
        break

运行效果如下图所示

Python超详细分步解析随机漫步

以上就是绘制随机漫步的花里胡哨的操作,会持续更新python相关知识

?人生苦短,我用python?

到此这篇关于Python超详细分步解析随机漫步的文章就介绍到这了,更多相关Python 随机漫步内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python将人民币转换大写的脚本代码
Feb 10 Python
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 Python
python开发之tkinter实现图形随鼠标移动的方法
Nov 11 Python
Django与JS交互的示例代码
Aug 23 Python
python爬虫headers设置后无效的解决方法
Oct 21 Python
Python3中条件控制、循环与函数的简易教程
Nov 21 Python
Python代码实现http/https代理服务器的脚本
Aug 12 Python
Python 单例设计模式用法实例分析
Sep 23 Python
用python3读取python2的pickle数据方式
Dec 25 Python
如何使用Python发送HTML格式的邮件
Feb 11 Python
Django模板标签{% for %}循环,获取制定条数据实例
May 14 Python
Python连接Impala实现步骤解析
Aug 04 Python
yolov5返回坐标的方法实例
Mar 17 #Python
PyTorch中的torch.cat简单介绍
Mar 17 #Python
Python Pygame实战在打砖块游戏的实现
python超详细实现完整学生成绩管理系统
Mar 17 #Python
Python Pygame实战之塔防游戏的实现
pytorch中的 .view()函数的用法介绍
Mar 17 #Python
Python绘画好看的星空图
You might like
Javascript typeof 用法
2008/12/28 Javascript
Javascript valueOf 使用方法
2008/12/28 Javascript
类似CSDN图片切换效果脚本
2009/09/17 Javascript
如何使用json在前后台进行数据传输实例介绍
2013/04/11 Javascript
js类定义函数时用prototype与不用的区别示例介绍
2014/06/10 Javascript
使用百度地图api实现根据地址查询经纬度
2014/12/11 Javascript
JavaScript Sort 的一个错误用法示例
2015/03/20 Javascript
动态加载jQuery的两种方法实例分析
2015/07/17 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
2016/05/31 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
利用JS代码自动删除稿件的普通弹幕功能
2019/09/20 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
jQuery实现动态操作table行
2020/11/23 jQuery
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
Python计算程序运行时间的方法
2014/12/13 Python
python3个性签名设计实现代码
2018/06/19 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
Python3中列表list合并的四种方法
2019/04/19 Python
Python实现最大子序和的方法示例
2019/07/05 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
python为什么会环境变量设置不成功
2020/06/23 Python
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
使用数据结构给女朋友写个Html5走迷宫游戏
2019/11/26 HTML / CSS
安德玛加拿大官网:Under Armour加拿大
2019/10/02 全球购物
银行会计业务的个人自我评价
2013/11/02 职场文书
管道维修工岗位职责
2013/12/27 职场文书
火车的故事教学反思
2014/02/11 职场文书
2014年领导班子专项整治整改方案
2014/09/28 职场文书
叶问观后感
2015/06/15 职场文书
病假证明模板
2015/06/19 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
幼儿园教学反思范文
2016/03/02 职场文书
2016年安康杯竞赛活动总结
2016/04/05 职场文书
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android
Golang 1.18 多模块Multi-Module工作区模式的新特性
2022/04/11 Golang