如何在c++/java中生成一组遵循一定分布的值
How to generate a set of values that follow certain distribution in c++/java?
例如,我有一个p.d.f f(x) = 1/25 - x/1250 (x = 0到50);我的问题是如何生成一组满足给定p.d.f的值。请给出一个关于如何在c++或java中实现的想法。非常感谢。
我不知道直接从pdf,但你可以转换pdf到cdf(通过积分),然后使用逆变换采样。这假设您有一种技术可以在[0, 1]
中生成随机数u
(例如Java中的Math.random()
)。
一旦您已经生成了这样一个u
,找到一个x
这样的cdf(x) = u
。x
就是你想要的值
您的功能类似于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"));
}
}
生成的图像对我来说非常好。
如果你的value -set是离散的,那么在文章"a Linear algorithm For generated Random Numbers With a Given Distribution"中描述了一个有效的算法。该算法包含一个简单的伪代码,时间为O(n),其中n为集合大小。
如果pdf不是离散的,如在您的示例中,请参见"蒙特卡罗模拟介绍"中的5.1节。
相关文章:
- 在 c++ 中拥有一组结构的正确方法是什么?
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 一组值的零开销下标运算符
- 使用一组结构,避免在一组结构中出现重复的结构
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 合并一组模板专用化
- 如何更好地检查两个 char 变量是否在一组值中?
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- 给定一个枢轴点,按照它们与枢轴点构成的角度递增顺序对一组点进行排序
- 如何从一组变量中查找最低值
- 如何根据对的第二个元素对 STL c++ 中的一组对进行排序?
- 如何通过查找迭代器结果分配给一组对的元素
- 读取一组用户输入,按升序排序,然后打印结果
- 如何从一组具有从左到右优先级的整数值创建有序整数键?
- 在 c++ 中定义一组 set 的迭代器
- 使用 C++20 概念强制类实现一组方法
- c++在循环中定义一组概率分布
- 如何在c++/java中生成一组遵循一定分布的值
- 使用boost c++为一组数据生成指数分布