You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义笛卡尔平面随机游走算法:代码正确性与端点绘制验证

随机游走路径绘制代码正确性分析

我正在开发一个程序,用于在笛卡尔平面上绘制基于以下随机游走算法的不同路径与点位:
从原点(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数组没有重置,后续路径会在之前路径的基础上延伸,而非从原点重新出发。

改进思路

  1. 补充终止逻辑:通过递归或迭代的方式,每一步同时处理「终止并记录位置」和「跳步继续」两种情况。
  2. 枚举所有可达端点:遍历所有可能的路径分支(包括中途终止),收集所有端点坐标并去重,再统一绘制。
  3. 正确绘制端点:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:38:13