没有头的猫在笛卡尔坐标系上随机漫步(未完成)

2023-11-12

想用python模拟随机运动

布朗运动 BROWNIAN MOTION

英国科学家布朗在两百年前第一次观察到水分子推动花粉颗粒在水面做不规则运动

现在我们也想用电脑模拟,在无外力作用下,花粉颗粒在水面的随机运动

在士大夫入图片描述

如何实现呢?详细解释直接写在代码里面

from random import choice
import matplotlib.pyplot as plt
class RandomWalk():
    def __init__(self,num_points=5000):
        self.num_points = num_points
        
        """
        初始化第一个点的位置
        用列表来存储点沿x轴和y轴分量
        num_point为随机模拟点运动的次数
        """
        self.x_value = [0]
        self.y_value = [0]
    
    def fillwalk(self):
        """
        整体思路:
    	用while循环模拟5000次随机运动
        每次随机模拟后,向列表中添加一个元素
    	直到列表中添加满5000个元素
    	"""
        while len(self.x_value) < self.num_points:
            """
            这里运动方向的设置实际上非常理想化,仅仅考虑在平面图上整数格点的
            移动,移动的距离也十分理想化,移动不同长度的距离的概率相同
            
            实际情况下移动不同长度有不一样的概率,我们将在后面的模型中对此问题
            进行修正
            """
            #设置每步沿x轴运动的方向,距离
            x_direction = choice([1,-1])
            x_distance = choice([0,1,2,3,4])
            x_step  = x_direction*x_distance
            #设置每步沿y轴运动的方向,距离
            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
            #每次从上一个位置上向下一个位置移动
            next_x = self.x_value[-1]+x_step
            next_y = self.y_value[-1]+y_step
            #将新点添加到列表中
            self.x_value.append(next_x)
            self.y_value.append(next_y)
            
    def resetvalue(self):
        #让点重新回到原点
        self.x_value = [0]
        self.y_value = [0]         
        
    def rwvisual(self,mode):
        #绘制随机漫步的散点图或者折线图
        view = RandomWalk()
        view.fillwalk()
        """
        根据参数选择不同绘制模式
        颜色默认是红色
        散点的大小默认是 s=1
        """
        if mode == 'scatter':
            plt.scatter(view.x_value,view.y_value,s=1,c='red')
        elif mode == 'plot':
            plt.plot(view.x_value,view.y_value,c='red')
        else:
            print('error')
        plt.show()
        
    

实际的模拟情况如图

散点图
折线图
还可以增加颜色映射,修改每个点的大小让整幅图看起来更加优雅
在这里插入图片描述

我们统计每次模拟随机运动最后落点的位置到原点的距离,可以得到一张这样的散点图
在这里插入图片描述
仔细观察这张图,每次模拟移动的距离呈现疏-密-更疏的三层结构

但也如上文所说,随机运动每次移动的距离,并不是在不同长度上概率均等,而是呈现正态分布,每次移动较短的距离和较长的距离的情况比较少,常常落在适中的距离范围内

正态分布

如何从零开始模拟优雅的正态分布钟形曲线?

下面请出高尔顿版的发明者——英国生物统计学家高尔顿

戳这里了解正态分布的前世今生------>正态分布的前世今生

来自己模拟正态分布

from random import choice
import matplotlib.pyplot as plt
"""
手动模拟高尔顿版的小球掉落的过程
假设小球在每次遇上板钉是向左右两边掉落的概率相等
连续多次落下小球,统计落在每个位置的小球总数
"""
class NormalDistribution():
    def __init__(self,ball_range=10,num_balls=5000):
        self.ball_range = ball_range
        self.num_balls = num_balls
        self.ball = 0
        self.box = {}
    def normaldistribute(self):
       
        #将某个与原点对称的区域的所有元素全部初始化
        for i in range(-self.ball_range,self.ball_range+1):
            self.box[i] = 0
        
        for i in range(self.num_balls):
            self.ball = 0
            for i in range(self.ball_range):
                self.ball  += choice([-1,1])
            self.box[self.ball] += 1
        print(self.box)

nord = NormalDistribution()
nord.normaldistribute()

到这里时问题已经初见端倪,按照上述代码运行,得到的 5000 个小球最后的随机落点是这样的

{-10: 3, -9: 0, -8: 48, -7: 0, -6: 228, -5: 0, -4: 604, -3: 0, -2: 988, -1: 0, 0: 1241, 1: 0, 2: 1048, 3: 0, 4: 573, 5: 0, 6: 216, 7: 0, 8: 47, 9: 0, 10: 4}

看的仔细的话已经能发现,任何奇数位置落点上都没有球。

为什么会这样?我们来仔细观察下真实的高尔顿板

小球每次的移动选择似乎并不是严格的向左一格或者是向右一格,而是存在类似于半格的移动
在这里插入图片描述
反思上述代码,每个小球都被设定成做出十次 +1 或是 -1 的移动选择,不管两种情况如何分配,是做5次 +1 ,5次 -1 ,后者是3次 +1 ,7次 -1,最终的结果一定是偶数,那么奇数位上一定没有小球落下

怎么修正问题?

一种可行的操作是在小球下落前增加一次条件选择,随机分配小球是做十次模拟移动还是九次模拟移动

改进了下

from random import choice
import matplotlib.pyplot as plt
"""
手动模拟高尔顿版的小球掉落的过程
假设小球在每次遇上板钉是向左右两边掉落的概率相等
连续多次落下小球,统计落在每个位置的小球总数
"""
class NormalDistribution():
    
    def __init__(self,ball_range=10,num_balls=5000):
        self.ball_range = ball_range #设置小球下落范围,小球落点将在
                                     #-ball_range 与 ball_range 内
        self.num_balls = num_balls   #设置总共下落的小球个数
        self.ball = 0                #设置小球原初位置
        self.box = {}                #创建一个字典,
                                     #字典中存储不同落点位置的小球数量
        self.basic_box = []          #创建一个列表,存储小球的下落范围
        self.basic_box_ball = []     #创建一个列表,存储下落范围内
                                     #每个落点上小球个数
    def normaldistribute(self):
       
        """
        将字典中某个与原点对称的区域的所有元素全部初始化
        
        """
        for i in range(-self.ball_range,self.ball_range+1):
            self.box[i] = 0
            self.basic_box.append(i)
        
        for i in range(self.num_balls):
            self.ball = 0
            for i in range(choice([self.ball_range,self.ball_range-1])):
                self.ball  += choice([-1,1])
                if i%100 == 0:
                    print('finish '+str(i/100))  #每完成一百次模拟打印一条消息
            self.box[self.ball] += 1
           
        for i in range(-self.ball_range,self.ball_range+1):
            self.basic_box_ball.append(self.box[i])
    
    def shownord(self):
       plt.scatter(self.basic_box,self.basic_box_ball)     

得到的结果很优雅
在这里插入图片描述
但是时不时就会出现这样的结果,在 0 处的小球数反而比 -1 和 1 处的小球数量少
在这里插入图片描述
当我们增加小球的数量,设置100 0000个小球,得到下面的图象
在这里插入图片描述
差强人意,在零点处本该凸起的帽子被削平了

再用一千万个小球试了试,也是同样的结果
在这里插入图片描述
本该是优雅的圆顶,现在却变成了35岁程序员的秃顶

莱维飞行 LEVY FLIGHT

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没有头的猫在笛卡尔坐标系上随机漫步(未完成) 的相关文章

随机推荐

  • 华为OD机试真题 Java 实现【寻找符合要求的最长子串】【2023Q1 200分】

    一 题目描述 给定一个字符串 s 找出这样一个子串 该子串中的任意一个字符最多出现2次 该子串不包含指定某个字符 请你找出满足该条件的最长子串的长度 二 输入描述 第一行为要求不包含的指定字符 为单个字符 取值范围 0 9a zA Z 第二
  • 在ubuntu上安装qt

    1 登录VM 上网下载Qt 保存路径一般在下载文件夹 可以下载后放到自定义文件夹 2 下载完成后 cd到保存文件的文件夹 并执行命令 sudo chmod a x qt opensource linux x64 5 9 run 将文件改变成
  • 数据结构进阶(一)

    更多内容可以访问我的个人博客 1 二叉查找树 参考 深入学习理解二叉搜索树 附详细讲解与实例分析 1 1 基本概念 二叉查找树 也称二叉搜索树 或二叉排序树 其要么是一颗空树 要么就是具有如下性质的二叉树 1 若任意节点的左子树不空 则左子
  • FPGA编程入门:Quartus II 设计1位全加器

    FPGA编程入门 Quartus II 设计1位全加器 一 半加器和1位全加器原理 一 半加器 二 1位全加器 二 实验目的 三 Quartus II设计半加器 一 新建工程 二 创建原理图 三 将设计项目设置成可调用的元件 四 半加器仿真
  • Centos 下安装使⽤ Memcache

    1 美图 2 安装 在 Centos 下安装使 用 yum 命令安装 Memcache 非常简单 yum install y memcached 启动 usr bin memcached b p 11211 m 150 u root gt
  • Linux-getopt命令详解

    getopt命令记录 简介 格式说明 要点 使用 简介 getopt命令可以接受一系列任意形式的命令行选项和参数 并自动将它们转换成适当的格式 格式说明 getopt三种使用方式 第一种 无法处理带有空格的参数 getopt optstri
  • c++void函数如何返回处理结果

    文章目录 一 void函数 二 void函数通过引用和指针返回处理结果 一 void函数 void在函数和变量中的含义详解 void表示无类型的意思 无类型可以包容有类型 可以用其定义的函数获得各种想要输出的数据类型 比如各个视觉库自定义的
  • java流

    java流 字节流 fr new FileReader E javaTxt adc txt fw new FileWriter E javaTxt adc txt 字符流 fis new FileInputStream E javaTxt
  • .gitignore文件不生效解决方法

    创建git仓库 忘记创建 gitignore 文件 导致提交的时候检测出一堆 DS Store node modules 等无需提交的文件 这个时候添加 gitignore 文件 如果是还没有提交 重新打开下编辑器就好了 编辑器是VS Co
  • Java 集合根据条件进行拆分

    创建测试集合 List
  • typescript学习(四)——泛型

    泛型 泛型 软件工程中 不仅要创建一致的定义良好的API 同时也要考虑可重用性 组件不仅能够支持当前的数据类型 同时也能支持未来的数据类型 这在创建大型系统时提供了十分灵活的功能 在像c 和java这样的语言中 可以使用泛型来创建可重用的组
  • 从C语言出发新角度内核剖析C++函数重载(千字精品,附带大厂面试问题回答)

    目录 C角度引入 函数重载 1 什么是函数重载 2 函数重载的优点 3 函数重载的特性 剖析函数重载 最后做一个小补充 大厂面试题 C角度引入 首先在进行C 讲解之前我们照例先来谈谈C语言是如何做的 在C语言中是没有函数重载存在的 每一个函
  • hibernate 关系映射文件配置

  • 1、Java实现队列(Queue)的方式

    编程题目 1 请用Java实现队列 Queue 队列实现的三种方式 1 通过数组实现一个队列 2 通过集合实现一个对列 3 通过两个堆栈实现一个队列 示例代码 1 通过数组实现一个队列 package program stack array
  • conda更新失败--更新后版本号不变

    我们通常使用下面的命令更新conda conda update n base c defaults conda 然而 这个命令有时候失效 如在我电脑上 4 10 0版本的conda一直无法升级为最新的23 3 1版本 失效情况 在更新前的状
  • vue 数字变星号 过滤器_Vue自定义过滤器格式化数字三位加一逗号实现代码

    前端处理一些金额 数字类的数据要求按照固定的格式显示 比如9 527 025 或者带有小数 如1 587 23 仍要三位一断 有些话也不必多说 既然要求如此 实现呗 作为前端主流框架之一的Vue 类似的功能肯定都有人写的很完善了 我呢 最讨
  • React Hooks 学习笔记

    大家好 小编最近在梳理 React Hook 的相关内容 由于看视频 看书 自己做项目总觉得缺点什么 总觉得看过了 内容太简单 有啥好写的 但是过了一段时间 感觉有些东西又模糊了 同时又觉得怕简单 写了也不一定有人看 但是想想 还是整理成文
  • iOS开发之第三方支付支付宝支付教程,史上最新最全第三方支付宝支付方式实现、支付宝集成教程,支付宝实现流程

    本章项目demo https github com zhonggaorong alipayDemo 支付宝支付大致流程为 1 公司与支付宝进行签约 获得商户ID partner 和账号ID seller 和私钥 privateKey 开发中
  • 【自然语言处理】主题建模:Top2Vec(理论篇)

    主题建模 Top2Vec 理论篇 Top2Vec 是一种用于 主题建模 和 语义搜索 的算法 它自动检测文本中出现的主题 并生成联合嵌入的主题 文档和词向量 算法基于的假设 许多语义相似的文档都可以由一个潜在的主题表示 首先 创建文档和词向
  • 没有头的猫在笛卡尔坐标系上随机漫步(未完成)

    想用python模拟随机运动 布朗运动 BROWNIAN MOTION 英国科学家布朗在两百年前第一次观察到水分子推动花粉颗粒在水面做不规则运动 现在我们也想用电脑模拟 在无外力作用下 花粉颗粒在水面的随机运动 如何实现呢 详细解释直接写在