Generate random numbers in Python — integers, floats, secure
PythonUse random for general cases, secrets for security, and the 3.13 CLI.

Use the standard library’s random module for simulations and general-purpose randomness, and switch to the secrets
module when you need cryptographic strength. The steps below show reliable ways to produce integers, floats, secure values, and command-line outputs.
Method 1: Generate a random integer (general-purpose)
Step 1: Import the random module.
import random
Step 2: Create an integer in an inclusive range with random.randint(a, b)
.
n = random.randint(0, 100) # 0 ≤ n ≤ 100
print(n)
This produces uniformly distributed integers over the closed interval you specify. For stride/step logic (for example, even numbers only), use random.randrange(start, stop, step)
.
Method 2: Generate a random float
Step 1: Import the random module.
import random
Step 2: Get a float in the half‑open interval [0.0, 1.0) with random.random()
.
x = random.random() # 0.0 ≤ x < 1.0
print(x)
Step 3: Get a float within a range using random.uniform(a, b)
.
y = random.uniform(2.5, 10.0) # a ≤ y ≤ b (end inclusion may vary due to floating-point rounding)
print(y)
Use random.random()
for quick normalized values, and random.uniform()
when you need a specific numeric span.
Method 3: Generate a cryptographically secure random integer
Step 1: Import the secrets module.
import secrets
Step 2: Produce a secure integer below a limit with secrets.randbelow(n)
.
token = secrets.randbelow(10) # 0..9, suitable for security-sensitive uses
print(token)
Use secrets for passwords, tokens, or any security-related randomness. The random
module is deterministic by design and is not suitable for cryptographic purposes.
Method 4: Reproduce results by seeding
Step 1: Import the random module.
import random
Step 2: Seed the generator with a fixed value using random.seed(value)
.
random.seed(42)
Step 3: Generate values after seeding to get the same sequence across runs (assuming single-threaded use).
print(random.randint(0, 100))
print(random.random())
Seeding stabilizes your outputs for testing and demonstrations. Accepted seed types include None
, int
, float
, str
, bytes
, and bytearray
.
Method 5: Pick random items from a sequence
Step 1: Import the random module.
import random
Step 2: Select a single element with random.choice(seq)
(sequence must be non-empty).
colors = ["red", "green", "blue"]
print(random.choice(colors))
Step 3: Draw multiple items with replacement using random.choices(population, k=n)
.
print(random.choices(colors, k=5))
Step 4: Draw multiple unique items (no replacement) with random.sample(population, k)
.
print(random.sample(colors, k=2))
Use weights (via choices(..., weights=[...])
) when you need non-uniform probabilities.
Method 6: Use the Python 3.13+ command-line interface
Step 1: Print a random integer between 1 and N (inclusive).
python -m random 10
# or
python -m random --integer 10
Step 2: Print a random float between 0 and N (inclusive of 0, end inclusion depends on floating-point rounding).
python -m random --float 1.8
Step 3: Print a random choice from provided arguments.
python -m random --choice egg bacon sausage spam
This built-in CLI streamlines quick draws without writing a script and is available starting in Python 3.13.
Method 7 (optional): Generate many random numbers efficiently (NumPy)
Step 1: Import NumPy if you’re working with large arrays or vectorized code.
import numpy as np
Step 2: Create an array of random integers or floats.
# 15 integers in [0, 10)
ints = np.random.randint(0, 10, size=15)
# 5 floats in [0.0, 1.0)
floats = np.random.random(5)
print(ints)
print(floats)
NumPy’s random routines generate large batches quickly and integrate well with scientific and data workflows.
Tips and cautions
- For security-sensitive randomness (passwords, tokens), always use
secrets
, notrandom
. random.random()
is half-open: it never returns 1.0.random.uniform(a, b)
computes via floating-point arithmetic—due to rounding, the endpointb
may or may not appear.- Seed the generator with
random.seed()
to make tests reproducible.
With these approaches, you can generate integers, floats, reproducible sequences, secure tokens, and even command-line outputs efficiently and correctly.
Comments