Python 寻找可用的“;斑点“;一组

Python 寻找可用的“;斑点“;一组,python,random,sequence,Python,Random,Sequence,我正在寻找一种方法,以编程方式在列表中查找可用(未使用)的位置,通常是一组条件。我可以举一个电话簿的例子:我将使用特定的规则生成电话号码(比如,在本例中,7位数字,这非常简单)。“生成器”将随机选择一个可用数字。下次尝试时,此号码将不会出现在生成器中 generator = PhoneNumberGenerator() generator.generate() "559-608-XXXX" # This number won't be available next time the genera

我正在寻找一种方法,以编程方式在列表中查找可用(未使用)的位置,通常是一组条件。我可以举一个电话簿的例子:我将使用特定的规则生成电话号码(比如,在本例中,7位数字,这非常简单)。“生成器”将随机选择一个可用数字。下次尝试时,此号码将不会出现在生成器中

generator = PhoneNumberGenerator()
generator.generate()
"559-608-XXXX"
# This number won't be available next time the generator.generate is called
一种可能是将“使用过的”电话号码存储在一个排序列表中,并寻找第一个可用的可能性。但这并不是随机的。第一个生成的数字是000-0000,第二个是000-0001,依此类推。另一种可能是创建所有可用电话号码的完整列表,并删除已使用的电话号码,但这将是一个巨大的列表。假设发电机经常使用,性能可能会受到影响

当然,我在这里使用了一个电话号码生成器的例子,但这可能是另一个生成器,用于车牌或验证码或其他任何东西,只是由一组规则定义。我正试图用Python实现这一点,因此欢迎使用这种语言的示例,但是如果您有其他语言的理论文章,也不要犹豫,如果可以的话,我将编辑这个问题以包含答案


提前感谢,

取两个素数,
p
q
,并为
0生成数字
p*i%q
。我觉得这有点冗长,请给出一个小代码片段示例,说明您的issue@Chris_Rands是的,但如果没有文本可能不会有什么帮助,事实上。你知道你将使用生成器的频率吗?为什么不将“使用过的”数字存储在
集合中
,然后在随机生成下一个之后,只需检查它是否在
集合中
;如果它已经在集合中,只需生成另一个数字,因为有很多条目(比如一千万条条目中的一百万条),这将使算法生成很多数字,并且总是命中一个已经使用过的数字。。。再试一次。。。打另一个用过的。。。再试一次。。。这很难预测。数字越多,它运行的时间就越长。这可能是不可避免的,但我想要一些性能更友好的。谢谢。如果我按照正确的顺序操作,则允许生成数字列表(随机生成),但如果再次使用,则当然会增加重复次数。@vincent lg是的,但您不必一次生成整个列表。只要跟踪
i
的当前值,就可以根据需要生成数字。不知道你所说的“如果再次使用”是什么意思。当然,如果你再次使用这个列表,你会得到重复。你可以使用不同的
p
q
生成不同的列表,如果你有足够大的
p
q
(以百万计),你应该得到足够大的列表来容纳你需要的所有电话号码。附录:如果你需要/想要更多的伪随机性,你也可以缓存下一个,比如,从生成器中选择100个数字,从中随机选择一个,然后为缓存生成一个新数字。
>>> p, q = 7, 11
>>> [p*i % q for i in range(q)]
[0, 7, 3, 10, 6, 2, 9, 5, 1, 8, 4]
>>> sorted(_)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> p, q = 101, 131
>>> [p*i % q for i in range(q)]
[0, 101, 71, ..., 60, 30]
>>> Counter(_).most_common(5)
[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1)]