limit_sample_space
float limit_sample_space(float minu, float maxu, float u)
float limit_sample_space(float maxu, float u)
minu
期望的u最小值。minu会被限制在0到1之间。
若未指定,minu默认为0。
maxu
期望的u最大值。maxu会被限制在0到1之间。
u
介于0到1之间的数值。
当u超出[minu,maxu]范围时,u会被以某种方式重新映射到该空间内,
使得在[0,1)区间均匀随机的u能产生[minu,maxu]区间内的均匀随机样本并返回。
这种方法避免了直接截断范围边界导致的额外样本聚集问题,同时也避免了范围适配对区间内样本的修改——
即如果u原本就在范围内,返回值将严格等于u。
不过,这种方法比范围适配或截断要慢得多,因此仅在同时需要均匀性和一致性的场景下使用。
例如,它可用于避免概率分布中的离群值,同时不影响非离群值样本。但这种方法也会导致结果不再随u单调递增。
实际上,仅使用范围适配通常也能有效避免离群值,代价是对非离群值样本产生轻微影响。
若要根据概率分布的minvalue和maxvalue确定minu和maxu,
可通过minu = CDF(minvalue)和maxu = CDF(maxvalue)计算,
其中CDF是该概率分布的累积分布函数(非逆函数)。
接收minvalue或maxvalue参数的sample_exponential、
sample_cauchy、sample_normal、sample_lognormal和
sample_lognormal_by_median函数版本都采用范围适配而非此限制方法,
因为前者能保持单调性。但若需要更好的区间样本一致性,可在采样前对本函数应用于u值。