2014-06-19 6 views
0

J'ai fait un programme simple en Python pour générer une chaîne aléatoire avec 5 numéros dans ce:générateur chaîne aléatoire python

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) 

Pas trop dur, non? Sauf pour une chose incroyablement étrange: les cordes qu'elle renvoie sont d'une longueur aléatoire. J'ai couru le code à plusieurs reprises, et voici quelques-uns de mes résultats:

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

Je ne peux pas comprendre ce qui se passe ... Quelqu'un peut-il me diriger dans la bonne direction?

+1

Sans faire une analyse au niveau profond, vous pouvez voir que, parfois, les deux ifs échoueront (conduisant à une fstring plus courte) et parfois, aléatoirement, ils ne le feront pas. – Malvolio

+0

Parfois, * très rarement *, ils ne le feront pas. En moyenne, vous obtiendrez 9.5 itérations dans la branche numérique, et seulement 5 feront n'importe quoi. Assez peu probable que vous obteniez seulement 5 itérations ou moins. –

Répondre

8

Vous lancez une pièce 19 fois; 50% du temps que vous choisissez une lettre, l'autre 50% vous choisissez un chiffre, mais seulement jusqu'à 5 fois. Si vous appuyez plus souvent sur l'option de numéro, n'ajoute rien.

Donc, vous construisez une chaîne jusqu'à 19 caractères, mais elle peut être plus courte. En moyenne, ce sera 9,5 lettres et 5 chiffres.

Seulement choisir les numéros si vous avez encore des numéros à choisir:

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) 

Démo:

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

Bien sûr! Il est bon de savoir que la logique fonctionne encore ... – 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

Cela peut générer des chaînes aussi courtes que 5 caractères, je ne pense pas qu'il le veuille –

+0

Cela produit seulement 5 caractères. –

Questions connexes