Min*_*ong 5 statistics probability prolog
我是Prolog的初学者.我想知道如何在Prolog中生成正态的分布式随机数?
我所知道的是使用库中的"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).
Run Code Online (Sandbox Code Playgroud)
该算法消耗两个均匀值并产生两个正常值.我提供两种解决方案.对于某些应用程序,执行此操作的其他方法可能更好.例如,您可以使用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.
Run Code Online (Sandbox Code Playgroud)
我对此并不十分自信,但它可能会让你超越驼峰.
归档时间: |
|
查看次数: |
229 次 |
最近记录: |