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

鱿鱼游戏桥模拟Matplotlib绘图遇TypeError错误求助

鱿鱼游戏桥模拟绘图错误解决办法

错误原因

  1. 类型不匹配:success_rate函数设计为接收单个整数类型的玩家编号,但调用时传入了整个player_number列表,导致执行player_number-1时触发list与int相减的类型错误。
  2. 全局变量污染:success_or_failure作为全局变量,每次调用tiles()时会累积之前的结果,导致后续统计数据完全错误。

修复方案

1. 让success_rate支持批量处理玩家编号

修改函数,使其接收玩家编号列表,遍历每个编号计算对应成功率,最终返回结果列表:

def success_rate(player_numbers):
    success_values = []
    number_of_values_for_each_player_number = len(giant_list) // 16
    for player_number in player_numbers:
        running_total = 0
        for p in range(number_of_values_for_each_player_number):
            running_total += giant_list[(player_number-1) + (16 * p)]
        success_value = (number_of_values_for_each_player_number - running_total) / number_of_values_for_each_player_number
        success_values.append(success_value)
    return success_values

2. 重构tiles()函数,避免全局变量

将success_or_failure移到函数内部,每次调用时重新初始化,确保每轮模拟结果独立:

def tiles():
    success_or_failure = []
    number_eliminated_tiles = 0
    for i in range(number_contestants):
        tile_advance = furthest_safe_tile(19 - number_eliminated_tiles)
        number_eliminated_tiles += tile_advance
        if number_eliminated_tiles == 19:
            success_or_failure.append(0) # 0代表成功存活
        else:
            success_or_failure.append(1)
    return success_or_failure

完整修复后代码

import random
import matplotlib.pyplot as plt


# 瓷砖编号1-19,返回0代表玩家一步都没成功踏上
def furthest_safe_tile(total_tiles):
    if total_tiles == 0:
        return total_tiles
    for k in range(1, total_tiles + 1):
        current_probability = random.uniform(0, 1)
        if k == total_tiles:
            return k
        elif current_probability < 0.5:
            return k


number_contestants = 16


def tiles():
    success_or_failure = []
    number_eliminated_tiles = 0
    for i in range(number_contestants):
        tile_advance = furthest_safe_tile(19 - number_eliminated_tiles)
        number_eliminated_tiles += tile_advance
        if number_eliminated_tiles == 19:
            success_or_failure.append(0) # 0代表成功存活
        else:
            success_or_failure.append(1)
    return success_or_failure


giant_list = []
for y in range(1000):
    giant_list += tiles()


def success_rate(player_numbers):
    success_values = []
    number_of_values_for_each_player_number = len(giant_list) // 16
    for player_number in player_numbers:
        running_total = 0
        for p in range(number_of_values_for_each_player_number):
            running_total += giant_list[(player_number-1) + (16 * p)]
        success_value = (number_of_values_for_each_player_number - running_total) / number_of_values_for_each_player_number
        success_values.append(success_value)
    return success_values


player_number = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]


plt.style.use('grayscale')
plt.figure(figsize=(10, 10))
plt.scatter(player_number, success_rate(player_number), alpha=0.4, c='black', s=50, marker='.')
plt.xlim(1, 16)
plt.ylim(0, 1)
plt.title("各参赛者存活概率统计图(蒙特卡洛模拟)")
plt.ylabel("存活概率")
plt.xlabel("参赛者编号")
plt.show()

内容的提问来源于stack exchange,提问作者cookiecainsy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:00:05