我有一个任意大小的全“0”的二维列表,想用“1”随机替换其中的 10 个

问题描述 投票:0回答:1

我正在制作扫雷机,并有一个二维列表表示一块板,该板始终是用户输入大小的正方形。它以零开头,我想用零替换其中的 x 个以表示地雷位置。 我需要它总是让 10 个地雷永远不会重复同一个地方,这是使用随机库。 我不介意计算时间几乎毫无意义,但我确实希望它优雅,我过去的所有项目都是计算机翻译思想的混乱。

我想我在 sudo 代码中有一个近似的解决方案:

地雷10 而地雷大于 1 选择了一个随机行 选择随机列 尝试改变它 如果它改变了我剩下的地方

但是这很笨重我想要一个更优雅的解决方案可能是一个内置的随机函数 IDK 这就是我问的原因

python list nested-lists
1个回答
2
投票

一种简单的单线方法是使用

itertools.product
生成所有位置的序列,并使用
random.sample
从该序列中挑选 10 个独特的元素。

假设棋盘是 5x5,你想要 10 件物品,那看起来像:

>>> import itertools
>>> import random
>>> random.sample(list(itertools.product(range(5), repeat=2)), k=10)
[(4, 1), (4, 3), (4, 2), (2, 1), (1, 2), (0, 4), (2, 4), (2, 0), (4, 0), (2, 3)]

请注意,如果您的棋盘大得离谱,则构建所有位置的列表可能不是最佳选择(尽管如果您的棋盘大得离谱,设置地雷的起始位置可能是您最不担心的事情)。最佳方法(即不需要您构建所有这些元组的列表只是为了选择其中的一个子集)将每个位置表示为

range
中的单个值,然后在调用
sample 后将值转换为元组
:

>>> [(n % 5, n // 5) for n in random.sample(range(5 * 5), 10)]
[(0, 3), (0, 1), (1, 4), (3, 0), (3, 1), (3, 2), (0, 4), (1, 2), (4, 0), (1, 0)]
© www.soinside.com 2019 - 2024. All rights reserved.