3 Best Ways to Generate a Random Number with a Fixed Amount of Digits in Python

5/5 - (2 votes)

Coding Challenge

⚔️ Challenge: Given an integer d representing the number of digits. How to create a random number with d digits in Python?

Here are three examples:

  • my_random(2) generates 12
  • my_random(3) generates 389
  • my_random(10) generates 8943496710

I’ll discuss three interesting methods to accomplish this easily in Python—my personal favorite is Method 2!

Shortest Solution with randint()

Let’s start with an easy hand-coded observation:

The easiest way to create a random number with two digits is to use random‘s randint(10, 99), with three digits is randint(100,999), and with four digits is randint(1000,9999).

Here’s the same example in Python code:

from random import randint

# Create random number with two digits (d=2):
print(randint(10, 99))

# Create random number with three digits (d=3):
print(randint(100, 999))

# Create random number with three digits (d=3):
print(randint(1000, 9999))

This solution can be generalized by using the one-liner random.randint(int('1'+'0'*(d-1)), int('9'*d)) that generates the start and end values on the fly, based on the number of digits d.

I used simple string arithmetic to define the start and end index of the random range:

  • int('1'+'0'*(d-1)) creates the start index such as 100 for d=3.
  • int('9'*d)) creates the end index that’s included in randint() such as 999 for d=3.

Here’s the basic Python example:

import random

def my_random(d):
    ''' Generates a random number with d digits '''
    return random.randint(int('1'+'0'*(d-1)), int('9'*d))


for i in range(1, 10):
    print(my_random(i))

'''
Output:
8
82
296
5909
90957
227691
1348638
61368798
160959002
'''

Cleanest Solution with randrange()

The cleanest solution is based on the randrange() function from the random module that takes the start and end index as input and generates a random number in between.

Unlike randint(), the end index is excluded in randrange(), so we have an easier way to construct our range for the d-digit random number problem: random.randrange(10**(d-1), 10**d).

Here’s an example:

import random

def my_random(d):
    ''' Generates a random number with d digits '''
    return random.randrange(10**(d-1), 10**d)


for i in range(1, 10):
    print(my_random(i))

'''
Output:
7
64
872
2440
39255
979369
6897920
83589118
707920991
'''

An Iterative Solution Aggregating Outputs of Single-Digit Random Function Calls

You can also use a one-liner to repeatedly execute the random.randint() function for each digit. To combine the digits, you convert each digit to a string, pass them into the string.join() function to get one string with d characters, and convert this string back to an integer:

int(''.join(str(random.randint(0,9)) for _ in range(d)))

Here’s this exact approach in a Python code snippet:

import random

def my_random(d):
    ''' Generates a random number with d digits '''
    return int(''.join(str(random.randint(0,9)) for _ in range(d)))


for i in range(1, 10):
    print(my_random(i))

'''
Output:
6
92
135
156
95865
409722
349673
31144072
439469934
'''

Summary

Thanks for reading through the whole article—I hope you got some value out of it.

Here’s again a summary of how to best generate a random number with d digits in Python:

  1. random.randint(int('1'+'0'*(d-1)), int('9'*d))
  2. random.randrange(10**(d-1), 10**d)
  3. int(''.join(str(random.randint(0,9)) for _ in range(d)))

Personally, I like Method 2 the most because it’s short, concise, and very efficient!