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

标签 random prolog probability

我是 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/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.

我对此不太有信心,但它可能会让你渡过难关。

关于random - 如何在Prolog中生成正态分布随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44503752/

相关文章:

Prolog 通配符 : Duplicate list without changing wildcard values

list - Prolog 流不存在错误

java - Java问题中概率分布函数的实现

c++ - 填充二维数组随机整数相同的数字

javascript - iMacros:x 次循环后暂停(Javascript)

java - 范围内的随机(双值)数字生成器

machine-learning - 如何推导边际似然函数?

ruby-on-rails - 随机化数据库记录 ID

database - 在这种特殊情况下如何使用 retract 删除重复项?

machine-learning - 监督学习