如何在循环中生成无重复随机数对,在8x8二维数组中随机放置指定数量Z
解决方案
这里提供两种实现思路,适配不同的使用场景:
方案1:全坐标洗牌法(推荐,适用于所有数量场景)
先把8x8数组的所有64个坐标全部生成,打乱顺序后取前N个即可,完全避免重复判断,逻辑最简单不易出错:
- 首先生成所有坐标对的列表,每个坐标可以用
(行号, 列号)的形式存储 - 对整个坐标列表做随机打乱
- 取前N个(N是你输入的0-64的整数)坐标,对应位置赋值为'Z'即可
代码示例(Python为例):
import random # 初始化8x8数组,默认占位符可按需修改 grid = [['.' for _ in range(8)] for _ in range(8)] n = int(input("请输入0-64之间的整数:")) # 生成所有坐标 all_positions = [(i, j) for i in range(8) for j in range(8)] # 打乱坐标顺序 random.shuffle(all_positions) # 取前n个坐标赋值为Z for x, y in all_positions[:n]: grid[x][y] = 'Z' # 打印结果验证 for row in grid: print(' '.join(row))
方案2:随机生成+去重校验(适合n较小的场景,比如n<16)
如果需要生成的Z数量很少,不需要生成全量坐标,可以用集合存储已经用过的坐标,生成新坐标后先判断是否已经存在,不存在再使用:
- 初始化一个空集合用来存储已经使用的坐标
- 循环直到集合长度等于n:
- 随机生成0-7之间的行号和列号
- 把坐标转成可哈希的元组判断是否在集合中
- 不在的话就加入集合,同时给数组对应位置赋值'Z'
代码示例(Python为例):
import random grid = [['.' for _ in range(8)] for _ in range(8)] n = int(input("请输入0-64之间的整数:")) used = set() while len(used) < n: x = random.randint(0,7) y = random.randint(0,7) if (x,y) not in used: used.add((x,y)) grid[x][y] = 'Z' # 打印结果验证 for row in grid: print(' '.join(row))
注意:当n接近64的时候,方案2会出现大量重复生成的情况,效率极低,这种场景优先用方案1。
内容的提问来源于stack exchange,提问作者Kaible
相关产品推荐
相关产品推荐

