首页 > 解决方案 > 用函数根据特定分布生成随机数

问题描述

我正在尝试根据我用function f (theta) = 1 + alpha*cos(theta)²;定义的精确分布在 Python 中生成一个随机数。变量 alpha 是一个常数。

不幸的是,我不知道该怎么做,因为不同的随机函数都遵循预定义的分布(正态分布、均匀分布、二项分布......)

你有想法吗?

标签: python

解决方案


假设f与概率密度函数 (PDF) 成正比,您可以使用拒绝抽样方法:在框中绘制一个数字,直到该框落入 PDF 中。它适用于任何具有有限域的有界 PDF,只要您知道域和边界是什么(边界是f域中的最大值)。在这种情况下,界限是1 + alpha,算法的工作原理如下:

import math
import random

def sample(alpha):
    mn=0 # Lowest value of domain
    mx=math.pi # Highest value of domain
    bound=1+alpha # Upper bound of PDF value
    while True:
       # Choose an X inside the desired sampling domain.
       x=random.uniform(mn,mx)
       # Choose a Y between 0 and the maximum PDF value.
       y=random.uniform(0,bound)
       # Calculate PDF
       pdf=1+alpha*math.cos(x)**2
       # Does (x,y) fall in the PDF?
       if y<pdf:
           # Yes, so return x
           return x
       # No, so loop

推荐阅读