python - 生成非重复随机数字对

时间:2015-05-02 07:46:11

标签: python

我试图生成随机数字对,以便将对象放置在网格中的随机位置。我已经尝试过寻找答案,但我还没有找到适合自己需要的答案。我不希望这对对象重复,但对象仍然可以放在同一行或列中。此外,用户输入网格的大小和对象的数量

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))

2 个答案:

答案 0 :(得分:3)

考虑这一点的一种方法是:X * Y个可能的位置(特别是board_size * board_size,在您的情况下),并且您想要选择Nself.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的回答:正如他所指出的那样,它有点浪费,但它非常清晰。