我是Prolog的初学者。我想知道如何在Prolog中生成正态分布的随机数。
我知道可以使用library(random)
中的maybe
来设置概率。但是当涉及到随机分布时怎么办?
我是Prolog的初学者。我想知道如何在Prolog中生成正态分布的随机数。
我知道可以使用library(random)
中的maybe
来设置概率。但是当涉及到随机分布时怎么办?
一般来说,编程语言会为你提供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).
这个算法需要两个均匀分布的值,并生成两个正态分布的值。我提供了两种解决方案。对于某些应用程序来说,其他方法可能更好。例如,您可以使用asserta/1
和retract/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.
我对此并不十分有信心,但它可能会帮助您克服困难。
http://swish.swi-prolog.org/example/Rserve.swinb
Real是连接R和Prolog的基于C的接口。有关更多信息,请参见doc/html/real.html中的文档。还有一篇论文[1]和doc/guide.pdf中的用户指南。
Real适用于当前版本的SWI和YAP。从版本1.1开始,支持在SWI Web服务器上使用Real。