2014-06-19 78 views
0

我在Python做了一个简单的程序来生成与5个号码中有一个随机字符串:随机字符串发生器蟒蛇

import random 

numcount = 5 
fstring = "" 

for num in range(19): #strings are 19 characters long 
    if random.randint(0, 1) == 1: 
     x = random.randint(1, 26) 
     x += 96 
     fstring += (chr(x).upper()) 
    elif not numcount == 0: 
     x = random.randint(0, 9) 
     fstring += str(x) 
     numcount -= 1 

print(fstring) 

不太难吧?除了一件令人难以置信的奇怪的事情:它返回的字符串是一个随机的长度。我已经运行代码几次,这里有一些我的结果:

>>> ================================ RESTART ================================ 
>>> 
VQZ99HA5DER0CES4 
>>> ================================ RESTART ================================ 
>>> 
05PS0T86LOZS 
>>> ================================ RESTART ================================ 
>>> 
E2QX8296XK 
>>> ================================ RESTART ================================ 
>>> 
M5X9K457QDNBPX 

我想不通这是怎么回事......任何人都可以点我在正确的方向?

+1

没有做任何深层次的分析,可以看到,有时两者IFS将失败(导致更短的fstring),有时是随机的,他们不会。 – Malvolio

+0

有时,*很少*,他们不会。平均来说,你会在数字分支中获得9.5次迭代,只有5次会做任何事情。相当不可能只有5次或更少的迭代。 –

回答

8

您将硬币翻转19次; 50%的时间你选择一个字母,另外50%你选择一个数字,但只能达到的5倍。如果你更频繁地点击数字选项,你不要添加任何东西

所以,你建立一个字符串高达 19个字符,但它可以更短。平均来说,它将是9.5个字母和5个数字。

只有挑选号码,如果你仍然有一个数字挑选:

import string 
import random 

numcount = 5 
chars = [] 

for num in range(19): #strings are 19 characters long 
    if numcount and random.random() < 0.5: 
     chars.append(str(random.randint(0, 9))) 
     numcount -= 1 
    else: 
     chars.append(random.choice(string.ascii_uppercase)) 

fchars = ''.join(chars) 

演示:

>>> import string 
>>> import random 
>>> string.ascii_uppercase 
'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 
>>> numcount = 5 
>>> chars = [] 
>>> for num in range(19): #strings are 19 characters long 
...  if numcount and random.random() < 0.5: 
...   chars.append(str(random.randint(0, 9))) 
...   numcount -= 1 
...  else: 
...   chars.append(random.choice(string.ascii_uppercase)) 
... 
>>> ''.join(chars) 
'3M6G97OEHP6TGYRONPV' 
>>> len(chars) 
19 
+0

当然!很高兴知道逻辑仍然有效...... – KnightOfNi

0
import random 

numcount = 5 
fstring = "" 


while numcount > 0: 
    if random.randint(0, 1) == 1: 
     x = random.randint(1, 26) 
     x += 96 
     fstring += (chr(x).upper()) 
    elif not numcount == 0: 
     x = random.randint(0, 9) 
     fstring += str(x) 
    numcount -= 1 

print(fstring) 
+1

这可以产生短至5个字符的字符串,我不认为他想要这个字符 –

+0

这只产生5个字符。 –