如何在 c++/java 中生成一组遵循特定分布的值?
Posted
技术标签:
【中文标题】如何在 c++/java 中生成一组遵循特定分布的值?【英文标题】:How to generate a set of values that follow certain distribution in c++/java? 【发布时间】:2011-10-07 17:56:29 【问题描述】:例如,我有一个 p.d.f f(x) = 1/25 - x/1250(从 x = 0 到 50); 我的问题是如何生成一组满足给定 p.d.f. 的值。 请提供有关如何在 c++ 或 java 中实现的想法。 非常感谢。
【问题讨论】:
【参考方案1】:我不知道直接来自 pdf,但您可以将 pdf 转换为 cdf(通过集成),然后使用 inverse transform sampling。这假设您有一种在[0, 1]
中生成随机数u
的技术(例如Java 中的Math.random()
)。
一旦你生成了这样的u
,找到一个x
这样的cdf(x) = u
。 x
就是你想要的值。
【讨论】:
欢迎来到 ***。感谢用户提供有用答案的一种方法是单击“up”按钮为答案投票,然后单击复选标记以接受答案。【参考方案2】:您的功能类似于f(x) := 1 - x
。对于这种情况,我做了以下事情:
-
整合函数
f
,生成F
。
规范化函数F
,使其域为[0;1)
,产生NF
。
反转NF
以产生dist
。
然后我使用以下代码检查结果:
package so7691025;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
public class DistImage
private static double dist(double x)
return 1.0 - Math.sqrt(1.0 - x);
public static void main(String[] args) throws IOException
final Random rnd = new Random(0);
BufferedImage img = new BufferedImage(1000, 1000, BufferedImage.TYPE_BYTE_GRAY);
int[] distrib = new int[1000];
for (int i = 0; i < 500000; i++)
distrib[(int) (dist(rnd.nextDouble()) * 1000)]++;
Graphics g = img.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, 1000, 1000);
g.setColor(Color.BLACK);
for (int i = 0; i < 1000; i++)
g.drawLine(i, 1000, i, 1000 - distrib[i]);
ImageIO.write(img, "png", new File("d:/distrib.png"));
生成的图像对我来说看起来很不错。
【讨论】:
【参考方案3】:如果您的值集是离散的,则文章 "A Linear Algorithm For Generating Random Numbers With a Given Distribution" 中描述了一个有效的算法。该算法包含一个简单的伪代码,时间为 O(n),其中 n 是集合大小。
如果 pdf 不是离散的,如您的示例,请参阅"Introduction to Monte Carlo Simulation" 中的第 5.1 节。
【讨论】:
以上是关于如何在 c++/java 中生成一组遵循特定分布的值?的主要内容,如果未能解决你的问题,请参考以下文章
编写一个关于Java Bean类url,包括:name(名称)site(官网)和property(性质)等属性。在控制器方法中生成一组Url,并在页面中返回。