【问题标题】: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/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.

我对此不是很有信心,但它可能会让你克服困难。

【讨论】:

  • 非常感谢!对我帮助很大!
【解决方案2】:

如果您使用的是 SWI-Prolog 或 SWISH,那么另一种选择是使用嵌入式 R,它在统计数据和概率方面为您提供了很大的灵活性。

http://swish.swi-prolog.org/example/Rserve.swinb

R project 提供统计计算和数据可视化。 SWISH可以通过Rserve访问R。

Integrative statistics with R:

Real 是一个基于 c 的接口,用于将 R 连接到 Prolog。有关更多信息,请参阅 doc/html/real.html 中的文档。 doc/guide.pdf 中还有一篇论文 [1] 和用户指南。

Real 适用于当前版本的 SWI 和 YAP。从 1.1 版开始,支持在 SWI 网络服务器上使用 Real。

【讨论】:

    猜你喜欢
    • 2014-11-06
    • 2016-09-21
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 2015-03-22
    • 1970-01-01
    相关资源
    最近更新 更多