Random numbers that follow a linear drop distribut

2019-09-21 21:11发布

I'd like to generate random numbers that follow a dropping linear frequency distribution, take n=1-x for an example.

The numpy library however seems to offer only more complex distributions.

2条回答
Luminary・发光体
2楼-- · 2019-09-21 21:54

So, it turns out you can totally use random.triangular(0,1,0) for this. See documentation here: 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.

Histogram made with matplotlib:

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

enter image description here

查看更多
该账号已被封号
3楼-- · 2019-09-21 22:02

For denormalized PDF with density

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

normalization constant is 1/2

CDF is equal to 2x-x^2

Thus, sampling is quite obvious

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

Sample program produced pretty much the same plot

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()

UPDATE

let's denote S to be an integral, and S_a^b is definite integral from a to b.

So

Denormalized PDF(x) = 1-x

Normalization:

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

Thus, normalized PDF

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

Let's compute CDF

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

Checking: CDF(0) = 0, CDF(1) = 1

Sampling is via inverse CDF method, by solving for x

CDF(x) = U(0,1)

where U(0,1) is uniform random in [0,1)

This is simple quadratic equation with solution

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

which translated directly into Python code

查看更多
登录 后发表回答