如何在Prolog中生成正态分布随机数?

Min*_*ong 5 statistics probability prolog

我是Prolog的初学者.我想知道如何在Prolog中生成正态的分布式随机数?
我所知道的是使用库中的"maybe"(随机)可以设置概率.但是它会出现分配问题呢?

Dan*_*ons 5

通常,语言为您提供从0到1的统一分布.有各种算法可以从统一分布到另一个分布,但这种情况特别常见,所以有几种方法可以做到这一点.

如果在正态分布中需要适量的随机值,Box-Muller变换是一个非常简单的算法,它相当于几个统一随机值的一些数学:

random_normal(N) :-
    random(U1), random(U2),
    Z0 is sqrt(-2 * log(U1)) * cos(2*pi*U2),
    Z1 is sqrt(-2 * log(U1)) * sin(2*pi*U2),
    (N = Z0 ; N = Z1).
Run Code Online (Sandbox Code Playgroud)

该算法消耗两个均匀值并产生两个正常值.我提供两种解决方案.对于某些应用程序,执行此操作的其他方法可能更好.例如,您可以使用asserta/1retract/1缓存第二个值并在不计算的情况下使用它,尽管在动态存储中乱搞可能与执行其他工作一样糟糕(您必须对其进行基准测试).这是用途:

?- random_normal(Z).
Z = -1.2418135230345024 ;
Z = -1.1135242997982466.

?- random_normal(Z).
Z = 0.6266801862581797 ;
Z = -0.4934840828548163.

?- random_normal(Z).
Z = 0.5525713772053663 ;
Z = -0.7118660644436128.
Run Code Online (Sandbox Code Playgroud)

我对此并不十分自信,但它可能会让你超越驼峰.