我是Prolog的初学者。我想知道如何在Prolog中生成正态的分布式随机数? 我所知道的是使用"也许"从库(随机)可以设置概率。但是它会出现分配问题呢?
答案 0 :(得分: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).
此算法使用两个统一值并生成两个正常值。我提供两种解决方案。对于某些应用程序,执行此操作的其他方法可能更好。例如,您可以使用asserta/1
和retract/1
来缓存第二个值并在不进行计算的情况下使用它,尽管在动态存储中乱搞可能与执行其他工作一样糟糕(您可以使用它)。 d必须对它进行基准测试)。这是用法:
?- 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.
我对此并不十分自信,但它可能会让你超越驼峰。
答案 1 :(得分:2)
如果您正在使用SWI-Prolog或SWISH,那么另一种选择是使用嵌入式r,这为您提供了很多关于统计和概率的灵活性。