# How to generate a random number with a specific amount of digits?

## Question:

Let’s say I need a 3-digit number, so it would be something like:

```
>>> random(3)
563
or
>>> random(5)
26748
>> random(2)
56
```

## Answers:

You can use either of `random.randint`

or `random.randrange`

. So to get a random 3-digit number:

```
from random import randint, randrange
randint(100, 999) # randint is inclusive at both ends
randrange(100, 1000) # randrange is exclusive at the stop
```

^{* Assuming you really meant three digits, rather than "up to three digits".}

To use an arbitrary number of digits:

```
from random import randint
def random_with_N_digits(n):
range_start = 10**(n-1)
range_end = (10**n)-1
return randint(range_start, range_end)
print random_with_N_digits(2)
print random_with_N_digits(3)
print random_with_N_digits(4)
```

Output:

```
33
124
5127
```

Does 0 count as a possible first digit? If so, then you need `random.randint(0,10**n-1)`

. If not, `random.randint(10**(n-1),10**n-1)`

. And if zero is *never* allowed, then you’ll have to explicitly reject numbers with a zero in them, or draw `n`

`random.randint(1,9)`

numbers.

Aside: it is interesting that `randint(a,b)`

uses somewhat non-pythonic “indexing” to get a random number `a <= n <= b`

. One might have expected it to work like `range`

, and produce a random number `a <= n < b`

. (Note the closed upper interval.)

Given the responses in the comments about `randrange`

, note that these can be replaced with the cleaner `random.randrange(0,10**n)`

, `random.randrange(10**(n-1),10**n)`

and `random.randrange(1,10)`

.

You could write yourself a little function to do what you want:

```
import random
def randomDigits(digits):
lower = 10**(digits-1)
upper = 10**digits - 1
return random.randint(lower, upper)
```

Basically, `10**(digits-1)`

gives you the smallest {digit}-digit number, and `10**digits - 1`

gives you the largest {digit}-digit number (which happens to be the smallest {digit+1}-digit number minus 1!). Then we just take a random integer from that range.

If you want it as a string (for example, a 10-digit phone number) you can use this:

```
n = 10
''.join(["{}".format(randint(0, 9)) for num in range(0, n)])
```

I really liked the answer of RichieHindle, however I liked the question as an exercise. Here’s a brute force implementation using strings:)

```
import random
first = random.randint(1,9)
first = str(first)
n = 5
nrs = [str(random.randrange(10)) for i in range(n-1)]
for i in range(len(nrs)) :
first += str(nrs[i])
print str(first)
```

From the official documentation, does it not seem that the sample() method is appropriate for this purpose?

```
import random
def random_digits(n):
num = range(0, 10)
lst = random.sample(num, n)
print str(lst).strip('[]')
```

Output:

```
>>>random_digits(5)
2, 5, 1, 0, 4
```

You could create a function who consumes an list of int, transforms in string to concatenate and cast do int again, something like this:

```
import random
def generate_random_number(length):
return int(''.join([str(random.randint(0,10)) for _ in range(length)]))
```

If you need a 3 digit number and want 001-099 to be valid numbers you should still use randrange/randint as it is quicker than alternatives. Just add the neccessary preceding zeros when converting to a string.

```
import random
num = random.randrange(1, 10**3)
# using format
num_with_zeros = '{:03}'.format(num)
# using string's zfill
num_with_zeros = str(num).zfill(3)
```

Alternatively if you don’t want to save the random number as an int you can just do it as a oneliner:

```
'{:03}'.format(random.randrange(1, 10**3))
```

python 3.6+ only oneliner:

```
f'{random.randrange(1, 10**3):03}'
```

Example outputs of the above are:

- ‘026’
- ‘255’
- ‘512’

Implemented as a function that can support any length of digits not just 3:

```
import random
def n_len_rand(len_, floor=1):
top = 10**len_
if floor > top:
raise ValueError(f"Floor '{floor}' must be less than requested top '{top}'")
return f'{random.randrange(floor, top):0{len_}}'
```

```
import random
fixed_digits = 6
print(random.randrange(111111, 999999, fixed_digits))
out:
271533
```

I know it’s an old question, but I see many solutions throughout the years. here is my suggestion for a function that creates an n digits random string with default 6.

```
from random import randint
def OTP(n=6):
n = 1 if n< 1 else n
return randint(int("1"*n), int("9"*n))
```

of course you can change "1"*n to whatever you want the start to be.