Random numbers that follow a linear drop distribution in Python

流过昼夜 提交于 2019-12-13 09:45:31

问题


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.


回答1:


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)




回答2:


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



来源:https://stackoverflow.com/questions/31168859/random-numbers-that-follow-a-linear-drop-distribution-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!