如何从大量数字中得出有偏的随机数

时间:2019-04-15 04:31:52

标签: python-3.x random

我想让Python 3.7.1选择一个介于0到100之间的数字。但是,我希望一个较小的数字比一个较大的数字更有可能,以相反的指数平滑渐变曲线的方式(确实不必是精确的。)

我想我可以开始

myrandomnumber = random.randint(0, 100)

然后将其链接到某种数组,以确定每个数字的不同百分比。我见过其他人通过随机掷骰子来做到这一点,但事实是,对于六个可能性而言,这是相当不错的,我想为一百(或更多)人这样做,并且不想坐在那儿制造巨大的骰子。具有一百个条目的数组。我想当然可以用这种方式做到这一点,但是我觉得Python可能有一种非常简单的方法来实现这一点,而我很想念。

谢谢,伙计们!

2 个答案:

答案 0 :(得分:2)

您可能想要的是一个gamma分布式随机数。

例如使用 k=1 θ=2.0

enter image description here

有些算法可以使用均匀分布的random函数来生成normalexponentialgamma分布的值。

但是,由于您使用的是python,因此您可能可以直接跳到使用numpy的random.gamma函数:

#the (1,2) shape ends basically at 20. Multiply by 5 to get my 0..100 scale
numpy.random.gamma(1, 2.0) * 5

答案 1 :(得分:1)

我假设您要生成一个有界范围内的整数值,并且当您谈论“偏差”时,您的意思是非均匀分布。由于您没有特定的参数分布,因此一种方法是从连续分布开始,然后使用int()获取结果的“底数”。您需要将上限增加1,以便四舍五入得到包含该上限的值。

一个简单的选择是triangular distribution。 Python提供了random.triangular()函数,该函数接受3个参数-下限,上限和模式。这是离散版本:

import random as rnd
import math
import sys

def triangle(upper_bound):
    return int(rnd.triangular(0.0, float(upper_bound + 1) - sys.float_info.epsilon, 0.0))

我从上限减去了float的epsilon,以防止在上限为100时(极不可能)获得101的结果的机会。另一个有界分布选择可能是beta distribution,您可以然后缩放并截断。

如果要使分布甚至进一步从小数点向0偏移,则可以使用exponential,或更普遍的gamma等分布,并进行截断和舍入。两者都有无限的支持,因此有两种截断方法。更简单的方法是使用acceptance/rejection-保持生成值,直到获得范围内的值:

def expo_w_rejection(upper_bound, scale_param = 0.4):
    upper_bound += 1
    while True:
        candidate = rnd.expovariate(1.0 / (upper_bound * scale_param))
        if candidate < upper_bound:
            return int(candidate)

像以前一样,将上限提高1,以得到包含截断后上限的结果。我还包括了一个可选的scale_param,该值应严格在0到1之间,即不包括任何一个限制。接近0的值将导致结果向左聚集更多,接近1的值将导致较少的聚集。

另一种方法是使用逆变换技术进行生成,并根据评估目标上限的累积分布函数,将制服的范围限制为不超过上限:

def trunc_exp(upper_bound, scale_param = 0.4):
    upper_bound = float(upper_bound) + 1.0 - sys.float_info.epsilon
    trunc = 1.0 - math.exp(-1.0 / scale_param)
    return int((-upper_bound * scale_param) * math.log(1.0 - trunc * rnd.random()))

这两种方法都会产生分布类似的结果,如以下屏幕截图所示。截断的反转生成“第1列”,而接受/拒绝生成“第2列”。

Histograms and summary statistics for truncated exponentials generated by inversion and acceptance/rejection