对随机数进行采样直到它不存在于集合中的更优雅的方法是什么?

Don*_*per 0 python loops

我想知道什么是更优雅的(如果这个词在这种情况下是合适的)方法来继续生成一个随机数,直到它不在使用的值集中。第一个选项是重复的,因为我们random type在 while 循环内部和外部都有相同的行。

然而,第二个需要添加一个条件语句来跳出循环。我知道这个特殊情况是微不足道的,两个版本都可以工作,但是在您看来哪个看起来更 Python/优雅?

def orchestrator(image = None):
    used_values = set()

    for _ in range(7):
        toss = np.random.random()

        if toss >= 0.5:
            random_type = np.random.randint(1,7,1)[0]
            while random_type in used_values:
                random_type = np.random.randint(1,7,1)[0]
            used_values.add(random_type)
            print(random_type)
Run Code Online (Sandbox Code Playgroud)
def orchestrator(image = None):
    used_values = set()

    for _ in range(7):
        toss = np.random.random()

        if toss >= 0.5:
            while True:
                random_type = np.random.randint(1,7,1)[0]
                if random_type not in used_values:
                    break
            used_values.add(random_type)
            print(random_type)
Run Code Online (Sandbox Code Playgroud)

Ama*_*dan 6

既然你无论如何都要记住一些东西,那么反其道而行之,记住没用的东西会更容易。这解决了几个问题:你永远不需要重复随机生成,一个列表就足够了,所以你不会得到一个集合的内存开销。

from random import shuffle
unused_values = list(range(7))
shuffle(unused_values)
Run Code Online (Sandbox Code Playgroud)

然后每当你需要一个新的非重复随机数时,

random_type = unused_values.pop()
Run Code Online (Sandbox Code Playgroud)