自定义笛卡尔平面随机游走算法:代码正确性与端点绘制验证
随机游走路径绘制代码正确性分析
我正在开发一个程序,用于在笛卡尔平面上绘制基于以下随机游走算法的不同路径与点位:
从原点(0, 0)出发,步骤1可选择:向右跳1/2、向左跳1/2,或在此处终止。
若未终止,步骤2可选择:向上跳1/4、向下跳1/4,或在此处终止。
若未终止,步骤3可选择:向右跳1/8、向左跳1/8,或在此处终止,以此类推。
该过程可无限进行:当步骤k为偶数且未终止时,向上或向下跳(1/(2k));当k为奇数时,向左或向右跳(1/(2k)),或终止。
我希望绘制有限步内可到达的所有端点集合,请问以下代码是否正确?另外,每条路径末端的彩色圆点为端点,它们的绘制是否正确?
用户提供的代码
import numpy import pylab import random import matplotlib.pyplot as plt axes = plt.axes() k = 50 x = numpy.zeros(k) y = numpy.zeros(k) lst = [] for j in range(1,30): for i in range(1,k): dir = [-1,1][random.randint(0,1)] if i%2!=0: x[i] = x[i - 1] + 1/(2**(i)) * dir y[i] = y[i - 1] else: x[i] = x[i - 1] y[i] = y[i - 1] + 1/(2**(i)) * dir plt.plot(x, y,marker = 'o') plt.title("Different paths the random walk movement sequences could take") pylab.show()
代码问题说明
- 未实现终止逻辑:原算法每一步都允许终止,但你的代码强制走完50步,完全忽略了中途停止的选项,和需求不符。
- 无法覆盖所有可达端点:你用随机方向生成路径,只能得到部分采样结果,但有限步内的可达端点是确定的集合,需要枚举所有跳步+终止的组合,而非随机模拟。
- 端点绘制错误:
plt.plot加marker='o'会给路径上每个点都画圆点,不是只绘制路径末端的端点;而且当前路径都是走满50步的,没有包含中途终止的端点。 - 数组复用bug:每次循环
j时,x和y数组没有重置,后续路径会在之前路径的基础上延伸,而非从原点重新出发。
改进思路
- 补充终止逻辑:通过递归或迭代的方式,每一步同时处理「终止并记录位置」和「跳步继续」两种情况。
- 枚举所有可达端点:遍历所有可能的路径分支(包括中途终止),收集所有端点坐标并去重,再统一绘制。
- 正确绘制端点:用
plt.scatter()单独绘制收集到的端点,避免给路径上的所有点都加标记。
示例改进代码(生成指定步数内的所有可达端点)
import matplotlib.pyplot as plt def generate_all_endpoints(max_steps): endpoints = set() # 初始原点(终止在第0步) endpoints.add((0.0, 0.0)) def traverse(x, y, current_step): if current_step > max_steps: return # 记录当前步终止的端点 endpoints.add((x, y)) # 执行当前步的跳步,进入下一步 if current_step % 2 == 1: # 奇数步:左右跳 traverse(x + 1/(2**current_step), y, current_step + 1) traverse(x - 1/(2**current_step), y, current_step + 1) else: # 偶数步:上下跳 traverse(x, y + 1/(2**current_step), current_step + 1) traverse(x, y - 1/(2**current_step), current_step + 1) traverse(0.0, 0.0, 1) return endpoints # 生成最多5步内的所有可达端点 max_steps = 5 all_endpoints = generate_all_endpoints(max_steps) x_list, y_list = zip(*all_endpoints) plt.scatter(x_list, y_list, color='darkblue', s=15) plt.title(f"最多{max_steps}步内的所有可达端点") plt.xlabel("X坐标") plt.ylabel("Y坐标") plt.grid(True, linestyle='--', alpha=0.7) plt.show()
内容的提问来源于stack exchange,提问作者liam song
相关产品推荐
相关产品推荐

