Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Tut] 3 Best Ways to Generate a Random Number with a Fixed Amount of Digits in Python
1
3 Best Ways to Generate a Random Number with a Fixed Amount of Digits in Python

5/5 – (1 vote)

Coding Challenge

[Image: 2694.png] Challenge: Given an integer
Code:
d
representing the number of digits. How to create a random number with
Code:
d
digits in Python?

Here are three examples:
  • Code:
    my_random(2)
    generates
    Code:
    12

  • Code:
    my_random(3)
    generates
    Code:
    389

  • Code:
    my_random(10)
    generates
    Code:
    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
Code:
random
‘s
Code:
randint(10, 99)
, with three digits is
Code:
randint(100,999)
, and with four digits is
Code:
randint(1000,9999)
.

Here’s the same example in Python code:

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
Code:
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
Code:
d
.

I used simple string arithmetic to define the start and end index of the random range:
  • Code:
    int('1'+'0'*(d-1))
    creates the start index such as 100 for
    Code:
    d=3
    .

  • Code:
    int('9'*d))
    creates the end index that’s included in
    Code:
    randint()
    such as
    Code:
    999
    for
    Code:
    d=3
    .

Here’s the basic Python example:

Code:
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
Code:
randrange()
function from the
Code:
random
module that takes the start and end index as input and generates a random number in between.

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

Here’s an example:

Code:
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
Code:
random.randint()
function for each digit. To combine the digits, you convert each digit to a string, pass them into the
Code:
string.join()
function to get one string with
Code:
d
characters, and convert this string back to an integer:

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

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

Code:
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
Code:
d
digits in Python:

  1. Code:
    random.randint(int('1'+'0'*(d-1)), int('9'*d))

  2. Code:
    random.randrange(10**(d-1), 10**d)

  3. Code:
    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!
Reply

Users browsing this thread:
1 Guest(s)


Forum Jump: