Python 中服从线性下降分布的随机数
Random numbers that follow a linear drop distribution in Python
我想生成遵循下降线性频率分布的随机数,以 n=1-x 为例。
然而,numpy 库似乎只提供更复杂的分布。
所以,事实证明你完全可以使用 random.triangular(0,1,0)
。请参阅此处的文档:https://docs.python.org/2/library/random.html
random.triangular(low, high, mode)
Return a random floating point number N such that low <= 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)
对于具有密度的非规范化 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
通过求解 x
的逆 CDF 方法进行采样
CDF(x) = U(0,1)
其中 U(0,1)
在 [0,1)
中是均匀随机的
这是一个有解的简单二次方程
x = 1 - sqrt(1 - U(0,1)) = 1 - sqrt(U(0,1))
直接翻译成Python代码
我想生成遵循下降线性频率分布的随机数,以 n=1-x 为例。
然而,numpy 库似乎只提供更复杂的分布。
所以,事实证明你完全可以使用 random.triangular(0,1,0)
。请参阅此处的文档:https://docs.python.org/2/library/random.html
random.triangular(low, high, mode)
Return a random floating point number N such that low <= 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)
对于具有密度的非规范化 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
通过求解 x
CDF(x) = U(0,1)
其中 U(0,1)
在 [0,1)
这是一个有解的简单二次方程
x = 1 - sqrt(1 - U(0,1)) = 1 - sqrt(U(0,1))
直接翻译成Python代码