generate random digits with length of 5

S

sotirac

Wondering if there is a better way to generate string of numbers with
a length of 5 which also can have a 0 in the front of the number.


<pre>
random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5
elements
code = 'this is a string' + str(random_number[0]) +
str(random_number[1]) + str(random_number[2]) + str(random_number[3])
+ str(random_number[4])
</pre>
 
C

Chris Rebert

Wondering if there is a better way to generate string of numbers with
a length of 5 which also can have a 0 in the front of the number.


<pre>
random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5
elements
code = 'this is a string' + str(random_number[0]) +
str(random_number[1]) + str(random_number[2]) + str(random_number[3])
+ str(random_number[4])

code = ''.join(str(digit) for digit in random_number)

Regards,
Chris
 
A

Aaron \Castironpi\ Brady

Wondering if there is a better way to generate string of numbers with
a length of 5 which also can have a 0 in the front of the number.

<pre>
 random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5
elements
 code = 'this is a string' + str(random_number[0]) +
str(random_number[1]) + str(random_number[2]) + str(random_number[3])
+ str(random_number[4])
</pre>

'%05i'%random.randint(0,99999)
 
G

Gary M. Josack

Chris said:
Wondering if there is a better way to generate string of numbers with
a length of 5 which also can have a 0 in the front of the number.


<pre>
random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5
elements
code = 'this is a string' + str(random_number[0]) +
str(random_number[1]) + str(random_number[2]) + str(random_number[3])
+ str(random_number[4])

code = ''.join(str(digit) for digit in random_number)

Regards,
Chris

will random.randint(10000,99999) work for you?
 
G

Gary M. Josack

Aaron said:
Wondering if there is a better way to generate string of numbers with
a length of 5 which also can have a 0 in the front of the number.

<pre>
random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5
elements
code = 'this is a string' + str(random_number[0]) +
str(random_number[1]) + str(random_number[2]) + str(random_number[3])
+ str(random_number[4])
</pre>

'%05i'%random.randint(0,99999)
This produces numbers other than 5 digit numbers. making the start
number 10000 should be fine.
 
B

bearophileHUGS

sotirac:
random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5 elements

But note that's without replacement. So if you want really random
numbers you can do this:
'93898'

If you need more speed you can invent other solutions, like (but I
don't know if it's faster):
from random import shuffle
ldigits = list(digits)
ldigits ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
shuffle(ldigits)
ldigits ['3', '8', '6', '4', '9', '7', '5', '2', '0', '1']
"".join(ldigits[:5])
'38649'

But this may be the most efficient way:
'37802'

Bye,
bearophile
 
G

Gary M. Josack

Gary said:
Aaron said:
Wondering if there is a better way to generate string of numbers with
a length of 5 which also can have a 0 in the front of the number.

<pre>
random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5
elements
code = 'this is a string' + str(random_number[0]) +
str(random_number[1]) + str(random_number[2]) + str(random_number[3])
+ str(random_number[4])
</pre>

'%05i'%random.randint(0,99999)
This produces numbers other than 5 digit numbers. making the start
number 10000 should be fine.
nevermind. my brain is tired tonight. this is the best solution.
 
M

Mensanator

Chris said:
Wondering if there is a better way to generate string of numbers with
a length of 5 which also can have a 0 in the front of the number.
<pre>
�random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5
elements
�code = 'this is a string' + str(random_number[0]) +
str(random_number[1]) + str(random_number[2]) + str(random_number[3])
+ str(random_number[4])
code = ''.join(str(digit) for digit in random_number)

will random.randint(10000,99999) work for you?

It doesn't meet the OP's requirement that the number
can start with 0. Also, the method the OP asks about
returns a list of unique numbers, so no number can
be duplicated. He can get 02468 but not 13345.

Now, IF it's ok to have an arbitrary number of leading
0s, he can do this:
'22315'
 
A

Aaron \Castironpi\ Brady

Chris said:
Wondering if there is a better way to generate string of numbers with
a length of 5 which also can have a 0 in the front of the number.
<pre>
random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5
elements
code = 'this is a string' + str(random_number[0]) +
str(random_number[1]) + str(random_number[2]) + str(random_number[3])
+ str(random_number[4])
code = ''.join(str(digit) for digit in random_number)
Regards,
Chris
</pre>
will random.randint(10000,99999) work for you?

It doesn't meet the OP's requirement that the number
can start with 0. Also, the method the OP asks about
returns a list of unique numbers, so no number can
be duplicated. He can get 02468 but not 13345.

Now, IF it's ok to have an arbitrary number of leading
0s, he can do this:

'22315'

Is a while loop until there are 5 distinct digits best otherwise?

while 1:
a= '%05i'% random.randint( 0, 99999 )
if len( set( a ) )== 5: break
 
T

Tim Chase

Wondering if there is a better way to generate string of numbers with
a length of 5 which also can have a 0 in the front of the number.

If you want to resample the same digit multiple times, either of these
two will do:
'09355'


If you need to prevent the digits from being reused
>>> d = list(digits)
>>> random.shuffle(digit)
>>> ''.join(d[:5])
'03195'

I suspect that the zfill responses don't have the property of equally
distributed "randomness", as the first digit may more likely be a zero.
The methods here should give equal probabilities for each choice in
each place.

-tkc
 
M

Michael Ströder

Gary said:
Aaron said:
Wondering if there is a better way to generate string of numbers with
a length of 5 which also can have a 0 in the front of the number.

<pre>
random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5
elements
code = 'this is a string' + str(random_number[0]) +
str(random_number[1]) + str(random_number[2]) + str(random_number[3])
+ str(random_number[4])
</pre>

'%05i'%random.randint(0,99999)
This produces numbers other than 5 digit numbers. making the start
number 10000 should be fine.

Why do you think it's wrong?

IMO it's exactly what was required.

Ciao, Michael.
 
A

Aaron \Castironpi\ Brady

Gary said:
Aaron said:
Wondering if there is a better way to generate string of numbers with
a length of 5 which also can have a 0 in the front of the number.
<pre>
 random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5
elements
 code = 'this is a string' + str(random_number[0]) +
str(random_number[1]) + str(random_number[2]) + str(random_number[3])
+ str(random_number[4])
</pre>
'%05i'%random.randint(0,99999)
This produces numbers other than 5 digit numbers. making the start
number 10000 should be fine.

Why do you think it's wrong?


'09449'

IMO it's exactly what was required.

Ciao, Michael.

As you read, there isn't agreement on whether the OP wanted
replacement. His original code didn't; his spec seemed to.
 
M

Mensanator

Chris Rebert wrote:
Wondering if there is a better way to generate string of numbers with
a length of 5 which also can have a 0 in the front of the number.
<pre>
random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5
elements
code = 'this is a string' + str(random_number[0]) +
str(random_number[1]) + str(random_number[2]) + str(random_number[3])
+ str(random_number[4])
code = ''.join(str(digit) for digit in random_number)
Regards,
Chris
</pre>
It doesn't meet the OP's requirement that the number
can start with 0. Also, the method the OP asks about
returns a list of unique numbers, so no number can
be duplicated. He can get 02468 but not 13345.
Now, IF it's ok to have an arbitrary number of leading
0s, he can do this:

'22315'

Is a while loop until there are 5 distinct digits best otherwise?

Of course not.
while 1:
� a= '%05i'% random.randint( 0, 99999 )
� if len( set( a ) )== 5: break

How is this better than the OP's original code?
 
M

Mensanator

Wondering if there is a better way to generate string of numbers with
a length of 5 which also can have a 0 in the front of the number.

If you want to resample the same digit multiple times, either of these
two will do:

�>>> from random import choice
�>>> ''.join(str(choice(range(10))) for _ in range(5))
'06082'

�>>> from string import digits
�>>> ''.join(choice(digits) for _ in range(5))
'09355'

If you need to prevent the digits from being reused

�>>> d = list(digits)
�>>> random.shuffle(digit)
�>>> ''.join(d[:5])
'03195'

I suspect that the zfill responses don't have the property of equally
distributed "randomness", as the first digit may more likely be a zero.
� The methods here should give equal probabilities for each choice in
each place.

Does he want equal probabilities of each digit in each place?
 
B

bearophileHUGS

Tim Chase:
I suspect that the zfill responses don't have the property of equally
distributed "randomness", as the first digit may more likely be a zero.

This code I have shown before:
str(randrange(100000)).zfill(5)

If the numbers are equally distributed in [0, 99999], then the leading
zeros have the correct distribution.

A little test program for you:

from string import digits
from random import choice, randrange
from collections import defaultdict

def main():
N = 1000000

freqs1 = defaultdict(int)
for i in xrange(N):
n = "".join(choice(digits) for d in xrange(5))
freqs1[n[0]] += 1
print [freqs1[str(i)] for i in xrange(10)]

freqs2 = defaultdict(int)
for i in xrange(N):
n = str(randrange(100000)).zfill(5)
freqs2[n[0]] += 1
print [freqs2[str(i)] for i in xrange(10)]

import psyco; psyco.full()
main()

The output:
[100153, 99561, 99683, 100297, 99938, 100162, 99738, 100379, 100398,
99691]
[99734, 100153, 100091, 100683, 99580, 99676, 99671, 100131, 100102,
100179]

Of course with a bit of math you can also demonstrate it :)

Bye,
bearophile
 
D

dusans

Chris Rebert wrote:
Wondering if there is a better way to generate string of numbers with
a length of 5 which also can have a 0 in the front of the number..
<pre>
random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5
elements
code = 'this is a string' + str(random_number[0]) +
str(random_number[1]) + str(random_number[2]) + str(random_number[3])
+ str(random_number[4])
code = ''.join(str(digit) for digit in random_number)
Regards,
Chris
</pre>
--
http://mail.python.org/mailman/listinfo/python-list
will random.randint(10000,99999) work for you?
It doesn't meet the OP's requirement that the number
can start with 0. Also, the method the OP asks about
returns a list of unique numbers, so no number can
be duplicated. He can get 02468 but not 13345.
Now, IF it's ok to have an arbitrary number of leading
0s, he can do this:
str(random.randint(0,99999)).zfill(5)
'00089'
str(random.randint(0,99999)).zfill(5)
'63782'
str(random.randint(0,99999)).zfill(5)
'63613'
str(random.randint(0,99999)).zfill(5)
'22315'
Is a while loop until there are 5 distinct digits best otherwise?

Of course not.


while 1:
a= '%05i'% random.randint( 0, 99999 )
if len( set( a ) )== 5: break

How is this better than the OP's original code?

Wow didnt know about '%05i' :)
 
S

sotirac

Gary said:
Aaron "Castironpi" Brady wrote:
Wondering if there is a better way to generate string of numbers with
a length of 5 which also can have a 0 in the front of the number.
<pre>
 random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5
elements
 code = 'this is a string' + str(random_number[0]) +
str(random_number[1]) + str(random_number[2]) + str(random_number[3])
+ str(random_number[4])
</pre>
'%05i'%random.randint(0,99999)
Why do you think it's wrong?

IMO it's exactly what was required.
Ciao, Michael.

As you read, there isn't agreement on whether the OP wanted
replacement.  His original code didn't; his spec seemed to.

My value of the result string can be '00000' to '99999'.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,743
Messages
2,569,478
Members
44,898
Latest member
BlairH7607

Latest Threads

Top