如何在c ++ / java中生成一组遵循某种分布的值?

时间:2011-10-07 17:56:29

标签: java c++ algorithm math probability

例如,我有一个p.d.f f(x)= 1/25 - x / 1250(从x = 0到50); 我的问题是如何生成一组满足给定p.d.f的值。 请介绍如何在c ++或java中实现。 非常感谢。

3 个答案:

答案 0 :(得分:3)

我不直接从pdf知道,但您可以将pdf转换为cdf(通过集成),然后使用inverse transform sampling。这假设您有一种技术可以在u中生成随机数[0, 1](例如,Java中的Math.random())。

生成此类u后,找到x cdf(x) = ux是您想要的值。

答案 1 :(得分:2)

您的功能类似于f(x) := 1 - x。在这种情况下,我做了以下事情:

  1. 将函数f集成到F
  2. 规范化函数F,使其域名[0;1),产生NF
  3. 反转NF以产生dist
  4. 然后我使用以下代码检查结果:

    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节。