java如何模拟概率
模拟概率的基本方法
在Java中模拟概率事件通常需要生成随机数,并根据概率分布进行条件判断。以下是几种常见的实现方式:
使用java.util.Random类
Random random = new Random();
double probability = 0.3; // 30%概率
if (random.nextDouble() < probability) {
// 事件触发
}
使用Math.random()
double probability = 0.7; // 70%概率
if (Math.random() < probability) {
// 事件触发
}
离散概率分布模拟
对于多个离散事件的概率分布(如抽奖系统),可以采用权重累计法:
double[] probabilities = {0.1, 0.3, 0.6}; // 三个事件的概率
double rand = Math.random();
double cumulative = 0.0;
for (int i = 0; i < probabilities.length; i++) {
cumulative += probabilities[i];
if (rand < cumulative) {
System.out.println("触发事件" + i);
break;
}
}
泊松分布模拟
通过指数分布模拟泊松过程:
Random rand = new Random();
double lambda = 2.5; // 平均发生率
double interval = -Math.log(1 - rand.nextDouble()) / lambda;
正态分布模拟
使用Box-Muller变换生成正态分布随机数:
Random rand = new Random();
double mean = 0.0, stdDev = 1.0;
double u1 = rand.nextDouble();
double u2 = rand.nextDouble();
double z0 = Math.sqrt(-2.0 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);
double normalValue = mean + z0 * stdDev;
蒙特卡洛模拟示例
通过大量随机采样计算圆周率:
int trials = 1000000;
int hits = 0;
Random rand = new Random();
for (int i = 0; i < trials; i++) {
double x = rand.nextDouble();
double y = rand.nextDouble();
if (x*x + y*y <= 1) hits++;
}
double piEstimate = 4.0 * hits / trials;
线程安全实现
多线程环境下建议使用ThreadLocalRandom:
import java.util.concurrent.ThreadLocalRandom;
double prob = ThreadLocalRandom.current().nextDouble();
对于更复杂的概率分布,可考虑使用第三方库如Apache Commons Math:

// 需要添加commons-math3依赖
BinomialDistribution binom = new BinomialDistribution(10, 0.5);
int successCount = binom.sample();






