By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
444,199 Members | 1,120 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 444,199 IT Pros & Developers. It's quick & easy.

Random numbers and alphabet mixture

P: 17
Hi,

I am a noob and I was wondering if there is way to generate random mixture of alphabets and numbers? For example:

1234567890ABCDEFG
or
4BA92ABD293BC3890

the length needs to be 17 characters long.
Mar 24 '08 #1
Share this Question
Share on Google+
8 Replies


jlm699
100+
P: 314
Hi,

I am a noob and I was wondering if there is way to generate random mixture of alphabets and numbers? For example:

1234567890ABCDEFG
or
4BA92ABD293BC3890

the length needs to be 17 characters long.
How about this list comprehension:
Expand|Select|Wrap|Line Numbers
  1. >>> ''.join([chr([random.randrange(48,58),random.randrange(65,91)][random.randint(0,1)]) for x in xrange(17)])
  2. '3E4F8F756F584Z8XU'
  3.  
Or in non-comprehension form:
Expand|Select|Wrap|Line Numbers
  1. import random
  2.  
  3. rstring = ''
  4. for x in xrange(17):
  5.     rint = random.randint(0,1)
  6.     if rint:
  7.         rstring += chr(random.randrange(48,58))
  8.     else:
  9.         rstring += chr(random.randrange(65,91))
  10.  
  11. >>> rstring
  12. 'T374TX07KEP031F17'
  13.  
Mar 24 '08 #2

bvdet
Expert Mod 2.5K+
P: 2,851
Hi,

I am a noob and I was wondering if there is way to generate random mixture of alphabets and numbers? For example:

1234567890ABCDEFG
or
4BA92ABD293BC3890

the length needs to be 17 characters long.
That is easily done with the random.choice() function, a list or string of character choices, and a list comprehension or for loop. Select a character from the choices 17 times, and join or concatenate the characters. Try coding yourself and post back.

Example output from a variable characters, 10 random strings:

>>> characters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW XYZ0123456789'
>>> j5jSeP4etag0EucN0
BAlxpfUfXnEjBNaL6
dB0GSaCFZMRg2DrqK
uMLz8ivN3cm8k8MCC
b6qHuPAf7ATYsLIjd
cfYmLEfGa66nKZzlJ
ldQd3ouLNSG7ghSu3
vxFn9UHchY8nRe2Mj
QfbuEMtfjRZJuxALZ
18TcORlqnZGrOUUrm
>>>
Mar 24 '08 #3

bvdet
Expert Mod 2.5K+
P: 2,851
Now that we have some code in this thread, I guess I'll post mine :)
Expand|Select|Wrap|Line Numbers
  1. >>> import random
  2. >>> import string
  3. >>> characters = string.letters+string.digits
  4. >>> no_chrs = 17
  5. >>> print ''.join([random.choice(characters) for _ in range(no_chrs)])
  6. uGAGd5Er82VOFsjwh
  7. >>> 
Mar 24 '08 #4

P: 17
thanks guys for the help.
Mar 24 '08 #5

P: 17
[quote=jlm699]How about this list comprehension:
Expand|Select|Wrap|Line Numbers
  1. >>> ''.join([chr([random.randrange(48,58),random.randrange(65,91)][random.randint(0,1)]) for x in xrange(17)])
  2. '3E4F8F756F584Z8XU'
  3.  
I am trying to understand this. So, you have a chr range of 0-9[48,58] and A-Z[65-91], but what is random.randint(0,1) is that step by one? I don't understand this. I like how this is written, but hopefully someone can explain.
Mar 24 '08 #6

jlm699
100+
P: 314
what is random.randint(0,1) is that step by one? I don't understand this.
No that is an obfuscated way to randomly choose between one of two choices.
Let's say you have a list tst = ['a', 'b']
Element 0 (tst[0]) is 'a' and element 1 (tst[1]) is 'b'. So let's say instead of storing the list to a variable tst you simply use the list itself:
Expand|Select|Wrap|Line Numbers
  1. >>> ['a', 'b'][0]
  2. 'a'
  3. >>> ['a', 'b'][1]
  4. 'b'
  5.  
Now if we put random.randint(0,1) in place of the index specifier, we have a randomly chosen element from the list picked
Expand|Select|Wrap|Line Numbers
  1. >>> import random
  2. >>> ['a', 'b'][random.randint(0,1)]
  3. 'b'
  4. >>> ['a', 'b'][random.randint(0,1)]
  5. 'a'
  6. >>> 
So in my code example I have the random letter and the random number pickers contained in a ad-hoc list [random_letter, random_number] and an element is chosen based on the result of randint(0,1). Does that clear it up a little bit? Unfortunately, this is not the best practice in terms of computing efficiency as a random letter and two random numbers are generated on each iteration (actually three random numbers), whereas bvdet's solution only requires one random number (index of list) to be generated.
Mar 24 '08 #7

bvdet
Expert Mod 2.5K+
P: 2,851
How about this list comprehension:
Expand|Select|Wrap|Line Numbers
  1. >>> ''.join([chr([random.randrange(48,58),random.randrange(65,91)][random.randint(0,1)]) for x in xrange(17)])
  2. '3E4F8F756F584Z8XU'
  3.  
I am trying to understand this. So, you have a chr range of 0-9[48,58] and A-Z[65-91], but what is random.randint(0,1) is that step by one? I don't understand this. I like how this is written, but hopefully someone can explain.
Breaking it up into two parts:
Expand|Select|Wrap|Line Numbers
  1. >>> (chr(random.randrange(48,58)),chr(random.randrange(65,91)))
  2. ('6', 'O')
  3. >>> (chr(random.randrange(48,58)),chr(random.randrange(65,91)))
  4. ('8', 'Y')
  5. >>> random.randint(0,1)
  6.  
  7. >>> random.randint(0,1)
  8. 1
  9. >>> (chr(random.randrange(48,58)),chr(random.randrange(65,91)))[random.randint(0,1)]
  10. 'T'
  11. >>> (chr(random.randrange(48,58)),chr(random.randrange(65,91)))[random.randint(0,1)]
  12. 'R'
  13. >>> (chr(random.randrange(48,58)),chr(random.randrange(65,91)))[random.randint(0,1)]
  14. '3'
  15. >>> 
#1 - Create a tuple containing a letter and a number
#2 - Take a slice of the tuple (using random.randint(0,1)) to produce a random letter or number
Mar 24 '08 #8

P: 17
Thanks that helps. Makes sense now.

No that is an obfuscated way to randomly choose between one of two choices.
Let's say you have a list tst = ['a', 'b']
Element 0 (tst[0]) is 'a' and element 1 (tst[1]) is 'b'. So let's say instead of storing the list to a variable tst you simply use the list itself:
Expand|Select|Wrap|Line Numbers
  1. >>> ['a', 'b'][0]
  2. 'a'
  3. >>> ['a', 'b'][1]
  4. 'b'
  5.  
Now if we put random.randint(0,1) in place of the index specifier, we have a randomly chosen element from the list picked
Expand|Select|Wrap|Line Numbers
  1. >>> import random
  2. >>> ['a', 'b'][random.randint(0,1)]
  3. 'b'
  4. >>> ['a', 'b'][random.randint(0,1)]
  5. 'a'
  6. >>> 
So in my code example I have the random letter and the random number pickers contained in a ad-hoc list [random_letter, random_number] and an element is chosen based on the result of randint(0,1). Does that clear it up a little bit? Unfortunately, this is not the best practice in terms of computing efficiency as a random letter and two random numbers are generated on each iteration (actually three random numbers), whereas bvdet's solution only requires one random number (index of list) to be generated.
Mar 24 '08 #9

Post your reply

Sign in to post your reply or Sign up for a free account.