Python二维列表场景下如何随机隐藏网格中恰好一半的数值
实现思路
- 先计算网格总元素数,确认需要隐藏的数量:总元素数为所有行的长度之和,隐藏数量取总数量的一半即可,若总元素数为奇数可根据需求调整取整规则。
- 生成网格所有位置的坐标列表,把二维的行列索引组合成元组存为列表,比如4行4列的规则网格会生成包含16个坐标元组的列表。
- 用
random.sample方法从坐标列表里随机抽取对应隐藏数量的不重复坐标,该方法原生支持无重复采样,完全避免重复修改同一个位置的问题。 - 遍历抽到的坐标,将对应位置的值修改为你定义的隐藏标记2即可。
原代码问题说明
你之前的实现是逐行随机选位置修改,很容易出现同一位置被多次重复赋值的情况,最终实际隐藏的数量会少于你预期的数值,自然没法精准控制隐藏占比。
优化后代码
import random # 类方法版本,适配你原来的代码结构 def startingArray(self, grid_copy): # 生成所有坐标的列表,兼容规则/不规则2D列表 all_positions = [(i, j) for i, row in enumerate(grid_copy) for j in range(len(row))] total_cells = len(all_positions) # 计算需要隐藏的数量,恰好一半 hide_count = total_cells // 2 # 随机采样不重复的坐标 hide_positions = random.sample(all_positions, hide_count) # 批量修改坐标的值为隐藏标记2 for i, j in hide_positions: grid_copy[i][j] = 2
效果验证
针对你给出的4×4示例网格,上述代码会随机选8个不同的位置设置为2,刚好隐藏一半的数值,完全符合你的需求。
内容的提问来源于stack exchange,提问作者leo
相关产品推荐
相关产品推荐

