在下面的代码中,它可能会打印两次数字吗?
import random
n = 0
lista = (345, 348, 333, 347, 346, 340, 342, 349, 330, 331, 334, 335, 336, 337, 338, 339, 360, 366, 368, 320, 324, 327, 328, 329, 380, 388, 389, 391, 392, 393)
while n < 150:
x = random.randint(234325,876432)
x = str(x)
z = str(random.choice(lista)) + x
n += 1
print z
答案 0 :(得分:2)
有可能吗?绝对
机会并不大,但仍有明显的可能性。
让您了解概率:
x有一系列642,107
个可能的值。
lista有一系列30
个可能的值。
因此,您有30*642,107 = 19,263,210
种可能组合的总空间。
要获得概率,您必须了解Birthday Paradox才有可能发生碰撞。
p(x) = 1 - p'(x) = 1 - \prod\limits_{i = 0}^{149}(1 - \frac{i}{19,263,210})
= 1 - \frac{(19,263,210 permute 149)}{19,263,210^{149}}
= 0.00057
每次运行时碰撞碰撞的几率为0.05%-0.06%。
平均而言,在执行约2,000次后,您将至少碰撞一次。
答案 1 :(得分:1)
是的,非常如此。如果您不想要完全更改算法,可能会记录您已打印过的数字。
答案 2 :(得分:1)
是的。
运行它并将列表的长度与列表的长度进行比较,而不重复。只有在数字不同时才会停止循环(重复):
import random
listb = []
def random_numbers():
n = 0
lista = (345, 348, 333, 347, 346, 340, 342, 349, 330, 331, 334, 335, 336, 337, 338, 339, 360, 366, 368, 320, 324, 327, 328, 329, 380, 388, 389, 391, 392, 393)
while n < 150:
x = random.randint(234325,876432)
x = str(x)
z = str(random.choice(lista)) + x
n += 1
listb.append(z)
iterations = 0
while len(listb) == len(set(listb)):
listb = []
iterations += 1
random_numbers()
print len(listb), len(set(listb))
print iterations