如何生成无重复随机数及在5×5棋盘正确放置4艘船?
问题解答
问题1:如何生成两组无重复的随机数?组数是否固定?
- 生成无重复随机数的核心是避免重复选取,实现方式可根据组数需求调整:
- 组数固定:先从目标数值范围中选取第一组无重复数,再从剩余未被选中的数里选取第二组。
- 组数不固定:先确定所有可用数的范围,再根据需要多次从剩余数中选取,直到满足组数要求(前提是剩余数足够分配)。
示例代码(生成两组各5个1-20的无重复随机数):
from random import sample total_range = list(range(1, 21)) group1 = sample(total_range, 5) remaining_nums = [num for num in total_range if num not in group1] group2 = sample(remaining_nums, 5) print("第一组无重复随机数:", group1) print("第二组无重复随机数:", group2)
注:使用random.sample()可以直接从序列中抽取指定数量的不重复元素,比手动判断更简洁高效。
问题2:解决棋盘船坐标重复导致船数量不足的问题
你的代码问题在于随机生成坐标时未做重复校验,重复的坐标会覆盖之前标记的船,导致最终显示的船数量不足。解决思路是确保每次生成的坐标未被使用过,直到凑齐4个唯一坐标。
修改后的代码:
from random import randint add_place = [] board = [] # 初始化5x5棋盘 for rows in range(5): board.append(["O"] * 5) # 生成4个不重复的船位坐标 while len(add_place) < 4: add_row = randint(0, 4) add_col = randint(0, 4) current_pos = [add_row, add_col] # 检查坐标是否已存在,不存在则添加 if current_pos not in add_place: add_place.append(current_pos) board[add_row][add_col] = "@" # 打印最终棋盘 for row in board: print(" ".join(row))
说明:用while循环替代原for循环,循环条件是已选坐标数量小于4。每次生成坐标后先校验是否在已选列表中,仅当坐标唯一时才标记到棋盘,确保最终一定有4艘船。
内容的提问来源于stack exchange,提问作者Emma Wu
相关产品推荐
相关产品推荐

