我试图生成随机数字对,以便将对象放置在网格中的随机位置。我已经尝试过寻找答案,但我还没有找到适合自己需要的答案。我不希望这对对象重复,但对象仍然可以放在同一行或列中。此外,用户输入网格的大小和对象的数量
def create_bombs(self):
bombs_flaged = 0
#creates the bombs
for i in range(self.bomb_num):
bomb_row = randint(0,self.board_size - 1)
bomb_col = randint(1,self.board_size)
self.bomb_list.append(Bomb(bomb_row, bomb_col, self, bombs_flaged))
答案 0 :(得分:3)
考虑这一点的一种方法是:X
* Y
个可能的位置(特别是board_size * board_size
,在您的情况下),并且您想要选择N
( self.bomb_num
)来自这些位置的随机样本,不重复。
random
模块中的sample
函数可以完美地完成此任务:
possible_coordinates = [(x, y) for x in range(X) for y in range(1, Y+1)]
bomb_coordinates = random.sample(possible_coordinates, N)
创建该列表有点浪费 - 但考虑到board_size
可能很小,如30,一个900元素的临时列表不值得担心。
答案 1 :(得分:1)
Python的set
旨在满足您的需求:成员资格测试速度非常快,而且速度非常快(
def create_bombs(self):
bombs_flagged = 0
existing_bomb_coords = set() # All bomb coordinates so far
# Creates the bombs
while len(existing_bomb_coords) < self.bomb_num: # Looping as much as needed
bomb_row = randint(0, self.board_size-1)
bomb_col = randint(1, self.board_size)
bomb_coords = (bomb_row, bomb_col)
if bomb_coords not in existing_bomb_coords: # Very fast test
self.bomb_list.append(Bomb(bomb_row, bomb_col, self, bombs_flagged))
existing_bomb_coords.add(bomb_coords) # New bomb registration
现在,我也喜欢@ abarnert的回答:正如他所指出的那样,它有点浪费,但它非常清晰。