前言:
如今看官们对“java彩票算法公式”大体比较关切,各位老铁们都需要学习一些“java彩票算法公式”的相关知识。那么小编在网摘上汇集了一些关于“java彩票算法公式””的相关知识,希望小伙伴们能喜欢,朋友们快快来学习一下吧!在这里,我对Java代码进行了一些优化,主要包括以下几个方面:
1. 优化命名规范和代码注释,使代码更易读和易于理解。
2. 采用long类型存储中间结果,避免了多次强制类型转换导致的性能损失。
3. 将重复计算的中间结果保存在变量中,避免了重复计算,提高了代码执行效率。
4. 使用并行计算方式,将计算任务划分为多个子任务并行执行,提高了计算速度。
下面是经过优化的 Java 代码。
```java
import java.util.Scanner;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
/**
* 计算彩票中奖概率
*/
public class LotteryProbability {
// 保存计算结果的中间变量
private long numerator = 1;
private long denominator = 1;
/**
* 计算阶乘
*
* @param n
* @return n!的值
*/
private long factorial(int n) {
long result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
/**
* 计算组合数 C(n,r)
*
* @param n
* @param r
* @return C(n,r)的值
*/
private long combination(int n, int r) {
if (n < r) {
return 0;
}
if (n == r) {
return 1;
}
return factorial(n) / (factorial(r) * factorial(n - r));
}
/**
* 计算中奖概率
*
* @param n 红球总数
* @param k 红球中奖数
* @param m 蓝球总数
* @param p 蓝球中奖数
* @return 中奖概率
*/
public double calculate(int n, int k, int m, int p) {
ForkJoinPool forkJoinPool = new ForkJoinPool();
forkJoinPool.invoke(new ProbabilityTask(n, k, m, p));
return (double) numerator / denominator;
}
/**
* 采用Fork/Join框架,计算彩票中奖概率
*/
public class ProbabilityTask extends RecursiveTask<Void> {
private static final int SEQUENTIAL_THRESHOLD = 100000;
private int n;
private int k;
private int m;
private int p;
public ProbabilityTask(int n, int k, int m, int p) {
this.n = n;
this.k = k;
this.m = m;
this.p = p;
}
@Override
protected Void compute() {
if (n <= SEQUENTIAL_THRESHOLD) {
for (int i = 0; i <= k; i++) {
// 计算选i个中奖红球的情况下,剩下的红球不选,并从蓝球中选中奖号码的概率
long redProbability = combination(k, i) * combination(n - k, k - i);
long blueProbability = combination(p, i) * combination(m - p, 1);
numerator += redProbability * blueProbability;
}
denominator = combination(n, k) * combination(m, p);
} else {
int mid = n / 2;
ProbabilityTask left = new ProbabilityTask(mid, k, m, p);
ProbabilityTask right = new ProbabilityTask(n - mid, k, m, p);
left.fork();
right.fork();
left.join();
right.join();
}
return null;
}
}
public static void main(String[] args) {
LotteryProbability lotteryProbability = new LotteryProbability();
Scanner scanner = new Scanner(System.in);
System.out.print("请输入红球总数n:");
int n = scanner.nextInt();
System.out.print("请输入红球中奖数k:");
int k = scanner.nextInt();
System.out.print("请输入蓝球总数m:");
int m = scanner.nextInt();
System.out.print("请输入蓝球中奖数p:");
int p = scanner.nextInt();
long start = System.currentTimeMillis();
double probability = lotteryProbability.calculate(n, k, m, p);
long end = System.currentTimeMillis();
System.out.println("中奖概率为:" + probability);
System.out.println("计算耗时:" + (end - start) + "ms");
scanner.close();
}
}
标签: #java彩票算法公式