我是 Prolog 的初学者。我想知道如何在 Prolog 中生成正态分布随机数。
我所知道的是使用library(random)
中的maybe
可以设置概率。但是当涉及到随机分布时呢?
最佳答案
一般来说,语言为您提供 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
缓存第二个值并在不进行计算的情况下使用它,尽管在动态存储中搞乱可能同样糟糕就像做其他工作一样(你必须对其进行基准测试)。使用方法如下:
?- 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.
我对此不太有信心,但它可能会让你渡过难关。
关于random - 如何在Prolog中生成正态分布随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44503752/