469,323 Members | 1,460 Online

# Random numbers and alphabet mixture 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
8 2666 jlm699
314 100+
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.
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
2,851 Expert Mod 2GB
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
2,851 Expert Mod 2GB
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
jumperbl
17 thanks guys for the help.
Mar 24 '08 #5
jumperbl
17 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
314 100+
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) is 'a' and element 1 (tst) 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']
2. 'a'
3. >>> ['a', 'b']
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
2,851 Expert Mod 2GB
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
jumperbl
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) is 'a' and element 1 (tst) 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']
2. 'a'
3. >>> ['a', 'b']
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