【python】随机模拟——赶火车问题、醉汉回家

1.赶火车问题。

一列列车从A站开往B站,某人每天赶往B站上车。他已经了解到火车从A站到B站的运行时间是服从均值为30min,标准差为2min的正态随机变量。火车大约下午13:00离开A站,此人大约13:30到达B站。火车离开A站的时刻及概率如表1所示,此人到达B站的时刻及概率如表2所示。问此人能赶上火车的概率有多大?
表1:火车离开A站的时刻及概率
火车离站时刻 	13:00 	13:05 	13:10
概率 	0.7 	0.2 	0.1
表2:某人到达B站的时刻及概率
人到站时刻 	13:28 	13:30 	13:32 	13:34
概率 	0.3 	0.4 	0.2 	0.1

提示:设火车离开的时刻为T1 ,火车运行的时间为T2,该人到达火车站的时间为T3,即为赶上火车。
在这里插入图片描述

随机生成正态分布数据
s = np.random.normal(mu, sigma, 1000) # 参数分别为均值、标准差和生成样本数

T2 = np.random.normal(30,2) # 随机生成均值为30,标准差为2的数据
import random

import numpy as np

# 定义火车离开A站时间的均值和标准差
mean_time = 30
std_time = 2

# 定义此人到达B站的时间
arrival_time = 30  # 单位:分钟,大约13:30到达B站

# 定义模拟次数
num_simulations = 10000

# 初始化赶上火车的次数
count = 0

# 进行模拟
for i in range(num_simulations):
    # 生成火车离开A站的随机概率
    prob_A = random.randint(0,1)
    if prob_A <= 0.7:
        T1 = 0
    elif prob_A <= 0.9:
        T1 = 5
    else:
        T1 = 10
    # 生成他到达B站的随机概率
    prob_B = random.randint(0,1)
    if prob_B <= 0.3:
        T3 = 28
    elif prob_B <= 0.7:
        T3 = 30
    else:
        T3 = 34
    # 火车运行的时间T2
    T2 = np.random.normal(30,2) # 随机生成均值为30,标准差为2的数据
    # print(T2)
    # 是否能赶上火车
    if T3 < (T1 + T2):
        count += 1

# 计算赶上火车的概率
probability_caught_train = count / num_simulations
print(f"通过{num_simulations}次模拟,此人能赶上火车的概率是:{probability_caught_train:.2%}")
"""
通过10000次模拟,此人能赶上火车的概率是:71.96%
"""

2.模拟二维随机游动(醉汉回家)

在一个[0,100]×[0,100]的正方形区域内,假设某人的初始位置在点(50,50)处,他周围(前、后、左、右)包括他所站的位置,共有9个格子,每一步随机地移动到一个格子处,也可以保持原地不动。请模拟他的行走路线并作图表示,当他行走到10000步或者出界,则停止模拟。

import numpy as np
import random
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Microsoft YaHei' # 处理文本

# 初始化参数
N = 10000  # 最大步数
bounds = (0, 100)  # 边界
init_position = (50, 50)  # 初始位置

# 创建用于存储位置的数组
positions = np.zeros((N, 2))
positions[0] = init_position

# 定义可能的方向和对应的步长
directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]  # 前、后、左、右

# 模拟随机游动
for step in range(1, N):
    # 随机选择一个方向
    direction = random.choice(directions)  # 使用random.choice而不是np.random.choice

    # 计算新位置
    new_position = tuple(np.clip(np.array(positions[step - 1]) + np.array(direction), bounds[0], bounds[1]))

    # 如果新位置在边界内,则更新位置
    if new_position[0] >= bounds[0] and new_position[0] <= bounds[1] and new_position[1] >= bounds[0] and new_position[
        1] <= bounds[1]:
        positions[step] = new_position
    else:
        # 如果新位置出界,则停止模拟
        break

    # 绘制行走路线
plt.figure(figsize=(6, 5))
plt.plot(positions[:, 0], positions[:, 1], marker='*')
plt.xlim(bounds)
plt.ylim(bounds)

plt.xlabel('X 轴')
plt.ylabel('Y 轴')
plt.title('随机游行')
plt.grid(True)
plt.show()

参考赶火车问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柴妮贝贝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值