我正在尝试编码this算法。我被困在log((1.0-u)/u))/beta
的部分;
据我所知,我无法在C中得到这个结果,因为它总会返回负值log(返回虚数值)。
试图打印log(1-5)的结果,例如,它给了我Nan。
我怎样才能得到
double x = (alpha - log((1.0-u)/u))/beta
然后?
非常感谢任何指针来解决这个问题。
谢谢
答案 0 :(得分:3)
在该算法中,u
应在[0,1]上均匀随机,因此数量(1-u)/u
永远不会为负。
答案 1 :(得分:2)
不要在范围u
之外传递(0,1)
的值(这在该文章的其中一条评论中提到)。请注意,(
和)
表示打开(即排他性)边界。
答案 2 :(得分:1)
如上所述,您需要u
的范围为(0,1)
(如果您是0或1,则您遇到麻烦)。您可能正在使用rand()
,在这种情况下您需要
double u = (rand() + 1) / (double)(RAND_MAX + 2);
double x = (alpha - log((1.0-u)/u))/beta
答案 3 :(得分:0)
我猜你是在0和1之间,因此是一个归一化的正随机。
答案 4 :(得分:0)
log( (1-u)/u ) = log(1-u)-log(u)
因此u
需要0<u<1
。图表看起来像这样
事实上,您可以通过u=0.5
看到反对称性,您可能只需担心0
和0.5
之间的值,但不包括0
。因此,对于u
&gt; 0.5,您需要设置u=1-u
并返回-log(1-u)+log(u)
。