出于某种目的,我需要从“倾斜均匀”分布中生成随机数(数据)。该分布的“斜率”可能会在某个合理的间隔内变化,然后我的分布应基于该斜率从均匀变为三角形。这是我的推论:
让我们简化一下,生成数据格式为到(蓝色,红色是均匀分布)。为了获得蓝线的概率密度函数,我只需要那条线的方程式。从而:
由于(图片):
我们有:
由于是PDF,因此CDF等于:
现在,让我们制作一个数据生成器。我们的想法是,如果我会解决,随机数X,可以计算如果我会从数(0 ,1 )从均匀分布所描述这里。因此,如果我需要从我的固定分配100张随机数φ ,乙,那么对于任意吨我从均匀分布(0 ,1 )有X 我从“倾斜分布”,和X可以被计算为:
根据这个理论,我用Python编写了如下代码:
import numpy as np
import math
import random
def tan_choice():
x = random.uniform(-math.pi/3, math.pi/3)
tan = math.tan(x)
return tan
def rand_shape_unif(N, B, tg_fi):
res = []
n = 0
while N > n:
c = random.uniform(0,1)
a = tg_fi/2
b = 1/B - (tg_fi*B)/2
quadratic = np.poly1d([a,b,-c])
rots = quadratic.roots
rot = rots[(rots.imag == 0) & (rots.real >= 0) & (rots.real <= B)].real
rot = float(rot)
res.append(rot)
n += 1
return res
def rand_numb(N_, B_):
tan_ = tan_choice()
res = rand_shape_unif(N_, B_, tan_)
return res
但是从 rand_numb
非常接近零或接近B(我将其设置为25)。没有差异,当我生成100个数字时,它们都接近25,或者都接近零。在一次运行:
num = rand_numb(100, 25)
numb
Out[140]:
[0.1063241766836174,
0.011086243095907753,
0.05690217839063588,
0.08551031241199764,
0.03411227661295121,
0.10927087752739746,
0.1173334720516189,
0.14160616846114774,
0.020124543145515768,
0.10794924067959207]
因此,我的代码中肯定存在某些错误。有人可以帮助我进行派生或编码吗?我现在为此感到疯狂,我看不到任何错误。我想R代码会给我类似的结果。
B
theta
n
R
x<-runif(n,-1,1);x<-(ifelse(runif(n,-1,1)>theta*x,-x,x)+1)*(B/2)