我正在寻找一个在8x8网格上随机生成硬币的程序。我创建了两个列表(一个列表用于X坐标,列表用于Y坐标)。在这些列表中,两个坐标不能相同。这很难解释,所以这就是我的意思:
[1, 7, 4, **6**, 9, 2, 3, **6**, 8, 0] (list for the x co-ordinate)
[9, 3, 3, **1**, 2, 8, 0, **1**, 6, 1] (list for the y co-ordinate)
因此,创建了两个列表。但(6,1)
出现两次。我不想要这个。那么,我如何在我的代码中允许这样做,以确保忽略它并将数字重新生成不同的坐标?我的代码如下,我真的不知道如何实现这样的系统事情!
def treasurePro():
global coinListX, coinListY
coinListX = []
coinListY = []
for x in range(10):
num = randint(0,8)
coinListX.append(num)
print(coinListX)
for x in range(10):
num = randint(0,8)
if num == 0 and coinListX[x] == 0:
treasurePro() #goes back to the beginning to restart.
else:
coinListY.append(num)
print(coinListY)
答案 0 :(得分:1)
你的电路板足够小,你可以简单地生成所有可能性,取样,然后转换到所需的X和Y单独列表。
possibilities = [(a,b) for a in range(10) for b in range(10)]
places = random.sample(possibilities, 10)
x,y = zip(*places)
答案 1 :(得分:1)
不要创建两个带坐标的列表,至少不是最初的。这只会使检测重复更难。
您可以使用坐标创建元组,这样您就可以检测重复项,甚至可以生成一系列整数,这些整数按顺序表示您的坐标,然后从这些整数中进行采样。后者非常有效。
要创建元组,基本上你想要创建8个唯一的这样的元组:
def treasurePro():
coords = []
while len(coords) < 8:
coord = randint(0, 8), randint(0, 8)
if coord not in coords:
coords.append(coord)
# now you have 8 unique pairs. split them out
coinListX, coinListY = zip(*coords)
这不是那么有效,因为coord not in coords
测试必须扫描每个新坐标增长的整个列表。对于要选择的大量坐标,这可能会显着减慢。你必须添加一个额外的seen = set()
对象,你也可以在循环中添加坐标并再次测试以解决这个问题。但是有更好的方法。
您的纸板尺寸为9x9,因此您有81个独特的坐标。如果您在random.sample()
(Python 2中为xrange()
)上使用range()
object,则可以轻松创建8个唯一值,然后从中提取行和列号:
def treasurePro():
coords = random.sample(range(9 * 9), 8) # use xrange in Python 2
coinListX = [c // 9 for c in coords]
coinListY = [c % 9 for c in coords]
此处random.sample()
可确保您获得8个唯一坐标。
这比预先生成所有可能的元组要有效得多;在Python 3中使用range()
使得上面使用O(K)内存,其中K是您需要生成的值的数量,而预先创建所有坐标将需要O(N ^ 2)内存(其中N是板面的大小)。
您可能仍希望存储(x, y)
坐标列表,而不是使用两个单独的列表。使用coords = [(c // 9, c % 9) for c in coords]
创建一个。
答案 2 :(得分:0)
您想要生成随机坐标,但您也想要拒绝任何坐标 已经出现在列表中的一对坐标。 (偶然, 而不是两个单独的整数列表,我建议使用一个 有序对的列表,即两个整数的元组。)
拒绝重复的一种方法是搜索现有列表 新的一套。这是O(n)并且比它需要的慢,尽管它 肯定会在你的用例中工作,其中n不能超过64。
另一种方法是尽可能维护第二个数据结构 在O(1)时间内查找64个单元中的每一个,例如8x8数组 布尔值。实际上,你可以单独使用这个结构;得到一个 使用的坐标列表,只是遍历它。
答案 3 :(得分:0)
cordX = [x for x in range(10)]
cordY = cordX[:]
random.shuffle(cordX)
random.shuffle(cordY)