2017-06-12 167 views
5

我是Prolog的初学者。我想知道如何在Prolog中生成正态分布的随机数字?
我所知道的是使用库中的“可能”(随机)可以设置概率。但是关于分配问题呢?如何在Prolog中生成正态分布随机数?

+3

你在[库(随机)](http://www.swi-prolog.org/pldoc/man?section=random)(即[随机均匀分布/1](http://www.swi-prolog.org/pldoc/man?predicate=random/1)),因此您必须使用算法将其转换为其他分布,如[在此问题中所述] (https://stackoverflow.com/questions/75677/converting-a-uniform-distribution-to-a-normal-distribution)。 –

回答

5

一般而言,语言为您提供了0到1之间的均匀分布。从统一分布到另一分布有各种算法,但这种情况特别常见,因此有几种方法可以实现。

如果你需要在一个正态分布随机值适量的,该Box-Muller transform是一个很简单的算法,它相当于一个小数学上的几个统一的随机值:

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). 

这种算法消耗2统一值并产生两个正常值。我提供了两种解决方案。对于某些应用程序,其他方式可能会更好。例如,您可以使用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. 

我对此没有很大的信心,但它可能会让你过驼峰。

+0

非常感谢!它帮助我很多! –

相关问题