2014-06-19 110 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個字符。 –