如何用Python从给定数值列表的分布中生成新随机数?
生成符合给定浮点列表分布的新随机数方法
针对手头的浮点数值列表,要生成符合相同分布的新随机数(而非仅复用原列表值),推荐两种无需预设分布边界的非参数方法:
方法一:核密度估计(KDE)采样
KDE会拟合数据的概率密度曲线,基于该曲线生成连续的新样本,适合需要平滑分布的场景。
代码实现
import numpy as np from scipy.stats import gaussian_kde # 原数据 list_numbers = [0.27,0.26,0.64,0.61,0.81,0.83,0.78,0.79,0.05,0.12,0.07,0.06,0.38,0.35,0.04,0.03,0.46,0.01,0.18,0.15,0.36,0.36,0.26,0.26,0.93,0.12,0.31,0.28,1.03,1.03,0.85,0.47,0.77] data = np.array(list_numbers) # 拟合KDE模型 kde = gaussian_kde(data) # 生成新样本(这里生成1000个,可按需调整) new_samples = kde.resample(1000)[0] # 可选:限制样本在原数据的取值范围内(避免极端值) min_val = data.min() max_val = data.max() new_samples = new_samples[(new_samples >= min_val) & (new_samples <= max_val)]
方法二:经验分布函数(ECDF)插值采样
基于原数据的排序结果,通过均匀随机数插值生成新值,完全贴合原数据的经验分布,无平滑处理。
代码实现
import numpy as np list_numbers = [0.27,0.26,0.64,0.61,0.81,0.83,0.78,0.79,0.05,0.12,0.07,0.06,0.38,0.35,0.04,0.03,0.46,0.01,0.18,0.15,0.36,0.36,0.26,0.26,0.93,0.12,0.31,0.28,1.03,1.03,0.85,0.47,0.77] data = np.array(list_numbers) # 对原数据排序 sorted_data = np.sort(data) n = len(sorted_data) # 生成0到1之间的均匀随机数 uniform_samples = np.random.uniform(0, 1, 1000) # 用线性插值得到对应分布的新样本 new_samples = np.interp(uniform_samples, np.linspace(0, 1, n), sorted_data)
验证分布一致性
生成新样本后,可通过直方图对比原数据与新样本的分布:
import matplotlib.pyplot as plt plt.hist(data, bins=10, alpha=0.5, label='原数据') plt.hist(new_samples, bins=10, alpha=0.5, label='新样本') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者datadatadata
相关产品推荐
相关产品推荐

