鱿鱼游戏桥模拟Matplotlib绘图遇TypeError错误求助
鱿鱼游戏桥模拟绘图错误解决办法
错误原因
- 类型不匹配:
success_rate函数设计为接收单个整数类型的玩家编号,但调用时传入了整个player_number列表,导致执行player_number-1时触发list与int相减的类型错误。 - 全局变量污染:
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
相关产品推荐
相关产品推荐

