Python中使用二维数组/列表生成唯一随机数的解决方案
核心问题点
之前代码达不到预期的原因非常明确:
- 3行8列的数组总共需要24个元素,1~9区间仅9个不同数字,按照鸽巢原理,不可能填充出24个完全不重复的元素
- 在嵌套循环内反复调用
random.sample()会重复生成新的随机序列,最终填充的元素数量自然会超出预期。
正确实现方案
正确逻辑是一次性生成足量的全局唯一随机数,再按行列长度切片拆分即可,不需要嵌套循环逐个赋值,代码如下:
import random rows = 3 cols = 8 total = rows * cols # 取值范围可根据需求调整,只需保证范围内整数总数 >= 元素总个数即可 # 示例取1~24区间的不重复随机数,刚好凑够24个元素 unique_nums = random.sample(range(1, total + 1), total) # 按列长度切片,直接生成目标规格的二维数组 my2DList = [unique_nums[i*cols : (i+1)*cols] for i in range(rows)] # 保留原代码的打印格式 row_str = "" for x in range(rows): for y in range(cols): row_str += f"{my2DList[x][y]}," print(row_str[:-1]) row_str = ""
注意事项
- 如果强行要求取值范围限定在1~9,不可能实现全元素不重复,9个数字最多支撑9个不重复元素位,剩余位置必然出现重复
- 如果需要更换随机数取值池,只需要修改
random.sample()的第一个参数即可,比如要从1~100里抽24个不重复数,就写random.sample(range(1, 101), total) - 一次性生成序列再切片的写法,避免了循环内反复调用随机接口的问题,执行效率更高,也不会出现元素数量超标的情况
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

