龙空技术网

这是条有可能赚钱的代码

无极剑圣 156

前言:

如今看官们对“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彩票算法公式