Python 对一个随机数进行采样,直到它';她不在场吗?

Python 对一个随机数进行采样,直到它';她不在场吗?,python,loops,Python,Loops,我想知道什么是更优雅的(如果这个词在这种情况下合适的话)方法来不断生成一个随机数,直到它不在所使用的值集中。第一个选项是重复的,因为while循环内外的random type都有相同的行 然而,第二个需要添加一个条件语句来打破循环。我知道这个特殊情况很简单,两个版本都可以工作,但在您看来,哪个版本看起来更Python/优雅 def orchestrator(image = None): used_values = set() for _ in range(7):

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

然而,第二个需要添加一个条件语句来打破循环。我知道这个特殊情况很简单,两个版本都可以工作,但在您看来,哪个版本看起来更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)

因为你无论如何都要做一些记忆,所以相反的方法更容易,记住没有用过的东西。这解决了几个问题:您永远不需要重复随机生成,并且一个列表就足够了,这样您就不会得到集合的内存开销

from random import shuffle
unused_values = list(range(7))
shuffle(unused_values)
然后每当你需要一个新的非重复随机数

random_type = unused_values.pop()

如果您只想生成从1到7的数字,唯一且不需要替换,为什么不只生成
random.shuffle(范围(1,7))
或其他任何数字?注意:如果您的问题不是生成非重复的随机数字,而是关于中间循环
中断
是否比重复代码更可取,我会投票支持
break
变得枯燥和可读性越来越高,有些人会说
break
永远是一个令人憎恶的东西——这是一个观点问题的完美例子,在你说“计算机编程的艺术”之前,它就会被关闭。
random_type = unused_values.pop()