Python 中遵循线性下降分布的随机数

问题描述 投票:0回答:3

我想生成遵循下降线性频率分布的随机数,以 n=1-x 为例。

但是 numpy 库似乎只提供更复杂的分布。

python random frequency-distribution
3个回答
4
投票

所以,事实证明你完全可以使用

random.triangular(0,1,0)
来实现这一点。请参阅此处的文档:https://docs.python.org/2/library/random.html

随机.三角形(低,高,模式)

返回一个随机浮点数 N,使得低 <= N <= high and with the specified mode between those bounds.

matplotlib
制作的直方图:

import matplotlib.pyplot as plt
import random
bins = [0.1 * i for i in range(12)]
plt.hist([random.triangular(0,1,0) for i in range(2500)], bins)

enter image description here


2
投票

对于具有密度的非规范化 PDF

1-x, in the range [0...1)

归一化常数为 1/2

CDF 等于

2x-x^2

因此,采样是相当明显的

r = 1.0 - math.sqrt(random.random())

示例程序产生了几乎相同的情节

import math
import random
import matplotlib.pyplot as plt

bins = [0.1 * i for i in range(12)]
plt.hist([(1.0 - math.sqrt(random.random())) for k in range(10000)], bins)
plt.show()

更新

我们将

S
表示为积分,
S_a^b
是从
a
b
的定积分。

那么

Denormalized PDF(x) = 1-x

标准化:

N = S_0^1 (1-x) dx = 1/2

因此,标准化 PDF

PDF(x) = 2*(1-x)

让我们计算CDF

CDF(x) = S_0^x PDF(x) dx = 2x - x*x

检查:

CDF(0) = 0
CDF(1) = 1

采样是通过逆 CDF 方法,通过求解

x

CDF(x) = U(0,1)

其中

U(0,1)
是 [0,1)

中的均匀随机

这是有解的简单二次方程

x = 1 - sqrt(1 - U(0,1)) = 1 - sqrt(U(0,1))

直接翻译成Python代码


© www.soinside.com 2019 - 2024. All rights reserved.