我想创建一个程序,随机生成一个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)
你的电路板足够小,你可以简单地产生所有的可能性,采取一个样本,然后转置到所需的X和Y的单独列表
不要用坐标创建两个列表,至少一开始不要。这只会增加检测重复的难度。你知道吗
您可以使用坐标创建元组,这样就可以检测重复项,甚至可以生成一系列按顺序表示坐标的整数,然后从这些整数中进行采样。后者效率极高。你知道吗
要创建元组,基本上需要创建8个唯一的此类元组:
这并不是很有效,因为
coord not in coords
测试必须扫描随着每个新坐标而增长的整个列表。对于要拾取的大量坐标,这可能会显著减慢速度。您必须添加一个额外的seen = set()
对象,您还需要向该对象添加坐标,然后在循环中再次测试以解决这个问题。不过,还有更好的办法。你知道吗你的棋盘大小是9x9,所以你有81个独特的坐标。如果在Python 2中的^{} object (} ,则可以轻松地创建8个唯一值,然后从这些值中“提取”行和列号:
xrange()
)上使用^{这里
random.sample()
保证得到8个唯一的坐标。你知道吗这也比预先生成所有可能的元组要高效得多;在python3中使用
range()
使上面的方法使用O(K)内存,其中K是需要生成的值的数量,而预先创建所有坐标则需要O(N^2)内存(其中N是电路板侧的大小)。你知道吗您可能仍希望存储
(x, y)
坐标的列表,而不是使用两个单独的列表。用coords = [(c // 9, c % 9) for c in coords]
创建一个。你知道吗你想生成随机坐标,但你也想拒绝任何 列表中已出现的一对坐标。(顺便说一句, 我建议使用一个整数列表,而不是两个单独的整数列表 有序对的列表,即两个整数的元组。)
拒绝重复的一种方法是在现有列表中搜索 新的一套。这是O(n)并且比它需要的慢,尽管它是 在n不能超过64的用例中肯定会起作用。你知道吗
另一种方法是维护第二个数据结构 在O(1)时间内查找64个单元格中的每一个,例如8x8数组 布尔型。实际上,您可以单独使用这个结构;来获得 使用的坐标列表,只要遍历它。你知道吗
相关问题 更多 >
编程相关推荐