插件窝 干货文章 如何高效生成指定范围内的正态分布随机数?

如何高效生成指定范围内的正态分布随机数?

随机数 random 正态分布 numbers 560    来源:    2025-03-15

在编程中,生成指定范围内的正态分布随机数是一个常见的需求。正态分布(也称为高斯分布)是一种连续概率分布,其概率密度函数呈钟形曲线。生成正态分布随机数的方法有很多,下面介绍几种常见的方法。

1. 使用Python的numpy

numpy是Python中用于科学计算的一个强大库,它提供了生成正态分布随机数的函数。

import numpy as np

# 生成指定范围内的正态分布随机数
def generate_normal_random(mean, std_dev, size, lower_bound, upper_bound):
    random_numbers = np.random.normal(mean, std_dev, size)
    # 将随机数限制在指定范围内
    random_numbers = np.clip(random_numbers, lower_bound, upper_bound)
    return random_numbers

# 示例:生成均值为0,标准差为1,范围在[-1, 1]之间的100个随机数
random_numbers = generate_normal_random(0, 1, 100, -1, 1)
print(random_numbers)

2. 使用Python的scipy.stats

scipy.stats库提供了更丰富的统计函数,包括生成截断正态分布的随机数。

from scipy.stats import truncnorm

# 生成指定范围内的正态分布随机数
def generate_truncated_normal(mean, std_dev, size, lower_bound, upper_bound):
    # 将范围转换为标准正态分布的范围
    a = (lower_bound - mean) / std_dev
    b = (upper_bound - mean) / std_dev
    random_numbers = truncnorm.rvs(a, b, loc=mean, scale=std_dev, size=size)
    return random_numbers

# 示例:生成均值为0,标准差为1,范围在[-1, 1]之间的100个随机数
random_numbers = generate_truncated_normal(0, 1, 100, -1, 1)
print(random_numbers)

3. 使用C++的<random>

在C++中,可以使用<random>库来生成正态分布的随机数。

#include <iostream>
#include <random>
#include <algorithm>

// 生成指定范围内的正态分布随机数
std::vector<double> generate_normal_random(double mean, double std_dev, int size, double lower_bound, double upper_bound) {
    std::random_device rd;
    std::mt19937 gen(rd());
    std::normal_distribution<> d(mean, std_dev);

    std::vector<double> random_numbers(size);
    for (int i = 0; i < size; ++i) {
        double num = d(gen);
        // 将随机数限制在指定范围内
        random_numbers[i] = std::clamp(num, lower_bound, upper_bound);
    }

    return random_numbers;
}

int main() {
    // 示例:生成均值为0,标准差为1,范围在[-1, 1]之间的100个随机数
    std::vector<double> random_numbers = generate_normal_random(0, 1, 100, -1, 1);
    for (double num : random_numbers) {
        std::cout << num << " ";
    }
    return 0;
}

4. 使用MATLAB

在MATLAB中,可以使用randn函数生成正态分布的随机数,并通过截断来限制范围。

% 生成指定范围内的正态分布随机数
function random_numbers = generate_normal_random(mean, std_dev, size, lower_bound, upper_bound)
    random_numbers = mean + std_dev * randn(size, 1);
    % 将随机数限制在指定范围内
    random_numbers = max(min(random_numbers, upper_bound), lower_bound);
end

% 示例:生成均值为0,标准差为1,范围在[-1, 1]之间的100个随机数
random_numbers = generate_normal_random(0, 1, 100, -1, 1);
disp(random_numbers);

总结

以上方法分别展示了在Python、C++和MATLAB中生成指定范围内的正态分布随机数的实现。根据你的编程语言和需求,可以选择合适的方法来实现。