如何使用Python在网格中创建10个随机x,y坐标

如何使用Python在网格中创建10个随机x,y坐标,python,random,coordinates,Python,Random,Coordinates,我需要创建一个8x8网格,并在网格上随机分配10枚硬币。我面临的问题是,randint函数有时会生成相同的随机坐标,因此只有9或8个硬币被生成并放置在网格上。我怎样才能确保这不会发生?干杯:)这是我目前的代码: from random import randint grid = [] #Create a 8x8 grid for row in range(8): grid.append([]) for col in range(8): grid[row].app

我需要创建一个8x8网格,并在网格上随机分配10枚硬币。我面临的问题是,randint函数有时会生成相同的随机坐标,因此只有9或8个硬币被生成并放置在网格上。我怎样才能确保这不会发生?干杯:)这是我目前的代码:

from random import randint

grid = []
#Create a 8x8 grid
for row in range(8):
    grid.append([])
    for col in range(8):
        grid[row].append("0")

#create 10 random treasure chests
    #problem is that it might generate the same co-ordinates and therefore not enough coins
for coins in range(10):
    c_x = randint(0, len(grid)-1)
    c_y = randint(0, len(grid[0])-1)
    while c_x == 7 and c_y == 0:
           c_x = randint(0, len(grid)-1)
           c_y = randint(0, len(grid[0])-1)
    else:
        grid[c_x][c_y] = "C"

for row in grid:
print(" ".join(row))

我已经包括了while/else-由于网格左下角不能有硬币

您可以在
while
循环中添加另一个检查,以确保当前选择的坐标处没有硬币。 顺便说一句,您还可以通过直接更改
randint
的范围来满足您的需要,从而避免已经进行的检查


或者您可以生成所有可能的7*7=49坐标(消除不需要的坐标),然后使用
np.random.choice
函数随机选取10个不同的坐标。

那么您希望生成10个随机唯一坐标吗

您可以使用集合来验证:

cords_set = set()
while len(cords_set) < 10:
    x, y = 7, 0
    while (x, y) == (7, 0): 
        x, y = randint(0, len(grid) - 1), randint(0, len(grid[0]) - 1)
    # that will make sure we don't add (7, 0) to cords_set
    cords_set.add((x, y))

请看下面的代码:

from random import randint

grid = []
#Create a 8x8 grid
for row in range(8):
    grid.append([])
    for col in range(8):
        grid[row].append("0")

for coins in range(10):
    c_x = randint(0, len(grid)-1)
    c_y = randint(0, len(grid[0])-1)
    while grid[c_x][c_y] == "C":
        c_x = randint(0, len(grid) - 1)
        c_y = randint(0, len(grid[0]) - 1)
    grid[c_x][c_y] = "C"
在生成坐标后,在为其指定坐标之前,请检查以确保没有“C”。如果有,请重新抽签并重新检查。如果没有,则指定一个并绘制下一个


如果有帮助,请告诉我☺

您只有64个事例,因此您可以将所有坐标生成为元组(x,y),然后您可以使用random.sample直接生成10个唯一元素,这样您就不必检查或重新绘制

import random
from itertools import product

g = [['0' for _ in range(8)] for _ in range(8)]

coord = list(product(range(8), range(8)))
for coins in random.sample(coord, 10):
    g[ coins[0] ][ coins[1] ] = 'C'

for row in g:
    print(' '.join(row))

该算法是否必须扩展到更高的维度,还是将保持一个8x8网格,包含10个硬币?到目前为止,这些答案对于您的案例来说都是有效的答案,但如果您计划放置更多的硬币或具有更高维度的网格,则可能需要不同的方法。hi@PatrikH是的,网格将在程序中稍后提供选项,以扩展大小并包含更多的硬币。如果我在函数中创建网格并用8替换参数/参数,那么这应该可以正常工作吗/是的,行得通。然而,问题答案的质量取决于问题的领域。算法的复杂性对于较小的问题大小(如8x8网格示例)没有多大影响,但会显著限制您对较大网格的选择。到目前为止,我看到的答案不会随着网格大小的增加而表现良好。然后:
对于跳线中的coords\u set:grid[coords[0]][coords[1]='C'
@Ev.Kounis是的,我相信OP会意识到这一点:)谢谢@DeepSpace我不知道set()-这应该会奏效!我对这一切还是新手:)谢谢你@polku-在你的建议后,我也做了一些研究,发现intertool.combinations_with_replacement或intertool.permutation也可能有助于生成49个唯一坐标:)哦,实际上它们不起作用!哈哈-刚刚读了一些关于他们的书。。。
import random
from itertools import product

g = [['0' for _ in range(8)] for _ in range(8)]

coord = list(product(range(8), range(8)))
for coins in random.sample(coord, 10):
    g[ coins[0] ][ coins[1] ] = 'C'

for row in g:
    print(' '.join(row))