如何在 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) = ux 就是你想要的值。

【讨论】:

欢迎来到 ***。感谢用户提供有用答案的一种方法是单击“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,并在页面中返回。

如何在Oracle中生成一周的第一天,一周的最后一天和两个日期之间的周数

如何使用 Angular CLI 在特定文件夹中生成组件?

如何在 Java 中生成特定范围内的随机整数?

如何在 Java 中生成特定范围内的随机整数?

如何在 R 中生成给定、均值、SD、偏斜和峰度的分布?