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

6

我是Prolog的初学者。我想知道如何在Prolog中生成正态分布的随机数。 我知道可以使用library(random)中的maybe来设置概率。但是当涉及到随机分布时怎么办?


4
你可以使用SWI-Prolog中的random/1函数来生成均匀分布的随机数,但是如果你需要其他分布类型的随机数,你需要使用一些算法来将其转换成相应的分布类型。这个问题在这个帖子中有详细描述。 - Daniel Lyons
2个回答

6

一般来说,编程语言会为你提供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/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.

我对此并不十分有信心,但它可能会帮助您克服困难。


非常感谢!这对我帮助很大! - Meow

3
如果您正在使用SWI-Prolog或SWISH,则另一个选项是使用嵌入式R,这将为您提供许多与统计和概率相关的灵活性。

http://swish.swi-prolog.org/example/Rserve.swinb

R项目提供统计计算和数据可视化。SWISH可以通过Rserve访问R。

使用R进行综合统计分析:

Real是连接R和Prolog的基于C的接口。有关更多信息,请参见doc/html/real.html中的文档。还有一篇论文[1]和doc/guide.pdf中的用户指南。

Real适用于当前版本的SWI和YAP。从版本1.1开始,支持在SWI Web服务器上使用Real。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接