我是Prolog的初学者。我想知道如何在Prolog中生成正态分布的随机数字?
我所知道的是使用库中的“可能”(随机)可以设置概率。但是关于分配问题呢?如何在Prolog中生成正态分布随机数?
5
A
回答
5
一般而言,语言为您提供了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).
这种算法消耗2统一值并产生两个正常值。我提供了两种解决方案。对于某些应用程序,其他方式可能会更好。例如,您可以使用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.
我对此没有很大的信心,但它可能会让你过驼峰。
+0
非常感谢!它帮助我很多! –
2
如果您正在使用SWI-Prolog的或SWISH那么另一种选择是使用嵌入式R,它给你很大的灵活性与统计和概率。
相关问题
- 1. 如何在matlab中生成跟随偏斜正态分布的随机数
- 2. Ruby中生成高斯(正态分布)随机数的代码
- 3. 在C中生成正态分布随机值的算法?
- 4. 如何从Matlab中截断对数正态分布生成随机数?
- 5. 如何使用AMPL中的正态分布生成一个随机数矩阵?
- 6. 在matlab中生成一个基于正态分布的随机数
- 7. Java - 实现产生正态分布的数字的随机向量生成器
- 8. 产生从用C数正态分布的随机数/ C++
- 9. 使用观测数据的形状生成随机对数正态分布
- 10. 正确生成随机数
- 11. 如何在django中生成随机数
- 12. 具有正态分布的随机数生成器,用于objective-c
- 13. 如何在GCC中为指数分布生成一个随机数5
- 14. 在Matlab中的正态分布的随机数
- 15. 如何从一个统一的分布在PHP中生成一个随机数?
- 16. 如何在C中生成一个真正的随机数?
- 17. 如何从C++中的二元正态和学生T分布生成随机样本?
- 18. 如何在PHP中生成累积正态分布
- 19. 用R中的双变量伽马分布生成随机数
- 20. Ruby 1.9.2中的分布式顺序随机数生成
- 21. 通过R中的随机数生成查找分布
- 22. 从CUDA中的高斯分布生成随机数
- 23. 如何在程序集中生成随机数生成器?
- 24. 如何使用助推威布尔分布库进行随机数生成?
- 25. 如何用泊松分布生成离散随机事件?
- 26. 如何生成均匀分布的随机DFA?
- 27. 随机分配正态分布的数字(javascript)
- 28. numpy,如何生成一个正态分布的整数集合
- 29. 如何从正态分布生成数据
- 30. 根据概率分布函数生成随机数
你在[库(随机)](http://www.swi-prolog.org/pldoc/man?section=random)(即[随机均匀分布/1](http://www.swi-prolog.org/pldoc/man?predicate=random/1)),因此您必须使用算法将其转换为其他分布,如[在此问题中所述] (https://stackoverflow.com/questions/75677/converting-a-uniform-distribution-to-a-normal-distribution)。 –