【问题标题】:How to generate normal distributed random numbers in Prolog?如何在 Prolog 中生成正态分布的随机数?
【发布时间】:2017-11-14 04:25:43
【问题描述】:
我是 Prolog 的初学者。我想知道如何在 Prolog 中生成正态分布的随机数。
我所知道的是使用来自library(random) 的maybe 可以设置概率。但是当涉及到随机分布时呢?
【问题讨论】:
标签:
random
prolog
probability
【解决方案1】:
一般来说,语言为您提供 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.
我对此不是很有信心,但它可能会让你克服困难。