例如,我有一个p.d.f f(x)= 1/25 - x / 1250(从x = 0到50); 我的问题是如何生成一组满足给定p.d.f的值。 请介绍如何在c ++或java中实现。 非常感谢。
答案 0 :(得分:3)
我不直接从pdf知道,但您可以将pdf转换为cdf(通过集成),然后使用inverse transform sampling。这假设您有一种技术可以在u
中生成随机数[0, 1]
(例如,Java中的Math.random()
)。
生成此类u
后,找到x
cdf(x) = u
。 x
是您想要的值。
答案 1 :(得分: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"));
}
}
结果图像对我来说非常好。
答案 2 :(得分:1)
如果您的值集是离散的,则文章"A Linear Algorithm For Generating Random Numbers With a Given Distribution"中描述了有效的算法。该算法包含一个简单的伪代码,并具有O(n)时间,其中n是设置大小。
当pdf不是离散时,如您的示例所示,请参阅"Introduction to Monte Carlo Simulation"中的第5.1节。