生成带前缀的随机数

时间:2014-05-22 16:06:16

标签: python list sum

在下面的代码中,它可能会打印两次数字吗?

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

3 个答案:

答案 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