Skip to content

A Comprehensive Guide to Random Number Generation in NumPy

Updated: at 04:55 AM

NumPy, the fundamental package for scientific computing in Python, provides powerful capabilities for generating random numbers. Three key functions - numpy.random.random, numpy.random.randint, and numpy.random.choice - enable flexible and efficient random number generation in various forms. This comprehensive guide will explain the syntax, parameters, and usage of these functions with clear examples and recommendations for best practices.

Table of Contents

Open Table of Contents


Generating random numbers is essential for many applications in data science, statistics, machine learning, and computer simulations. Pseudorandom number generators (PRNGs) in NumPy produce numerically random sequences from deterministic algorithmic processes.

Compared to Python’s built-in random module, NumPy offers advanced pseudo-random number generation suitable for scientific and production use. The main advantages are:

This guide will focus on using numpy.random.random, numpy.random.randint, and numpy.random.choice for various types of random number generation tasks.


The numpy.random.random function generates arrays filled with random floats over the half-open interval [0.0, 1.0). This is useful for producing random probability values.



The size parameter specifies the shape of the output array.


Generate a single random float between 0.0 and 1.0:

import numpy as np

# 0.6964691855978616

Generate a 1D array containing 3 random values:

# [ 0.55519924  0.05808361  0.86617615]

Generate a 2x3 array with random floats:


[[0.3059794  0.89266296 0.38030767]
 [0.78535858 0.46059827 0.16067653]]



The numpy.random.randint function returns random integers from a specified range. This offers an efficient alternative to generating uniform discrete distributions.


numpy.random.randint(low, high=None, size=None)

The low parameter is the inclusive lower bound, high is the exclusive upper bound, and size indicates the shape of the output array.


Generate a single random integer between 0 and 10:

# 7

Generate a 1D array of 5 random integers between 0 and 10:

print(np.random.randint(11, size=5))
# [5 0 3 4 7]

Generate a 2x3 array of random integers between 10 and 50:

print(np.random.randint(10, 51, (2,3)))

[[17 25 47]
 [21 10 16]]



The numpy.random.choice function selects random values from a given 1D data array. This enables random sampling from known arrays of possible values.


numpy.random.choice(a, size=None, replace=True, p=None)

The a parameter is the 1D data array to sample from. size indicates the shape for the output array of drawn samples. replace determines if sampling is done with replacement. p specifies customized probability weights for sampling.


Select a random value from a given 1D array:

import numpy as np

arr = np.array([3, 5, 7, 11])
# 7

Sample 5 random values from arr with replacement:

print(np.random.choice(arr, size=5))
# [11  5  3  5  3]

Sample 4 random values from arr without replacement:

print(np.random.choice(arr, size=4, replace=False))
# [11  5  3  7]

Sample randomly from arr with customized probability weights:

prob = [0.1, 0.3, 0.6, 0]
print(np.random.choice(arr, p=prob, size=3))
# [7 5 3]


Specifying a Random Seed

For reproducibility and controlled variation in stochastic applications, it can be useful to specify a fixed random seed value. This seed initializes the pseudorandom number generator to produce an exact repeatable sequence of random numbers.

Set a random seed before generating random values:


# 0.6964691855978616
# 7


# 0.6964691855978616
# 7

The same seed reproduces the same “random” numbers. Omitting the seed varies the results.


Alternative PRNG Algorithms

NumPy provides several pseudorandom number generator algorithms that can be selected and configured using the numpy.random.RandomState class.

The default is the high-quality Mersenne Twister PRNG, but alternatives like the PCG64 algorithm are available:

from numpy.random import RandomState

rng = RandomState(pcg64=12345)
# 0.22733602246716966

This advanced functionality allows fine-tuning PRNG performance for specialized needs. However, Mersenne Twister is recommended for most general use cases.



This guide covered NumPy’s core random number generation capabilities provided by numpy.random.random, numpy.random.randint, numpy.random.choice, and numpy.random.seed.

Key takeaways include:

Properly leveraging random number generation enables efficient Monte Carlo simulations, probabilistic modeling, stochastic optimization, and statistical sampling applications in data science and scientific computing. NumPy’s random functions integrate well with its multidimensional array operations and ufuncs, providing an essential toolset for technical computing with Python.