java - 尝试创建一个选择 7 位数字并在彩票上尝试的程序,有没有更简单的方法可以做到这一点?
问题描述
我想编写一个程序,该程序基本上可以采用 7 个“快速选择”随机生成的数字和 7 个中奖号码,并一遍又一遍地循环它,直到它命中并计算它在命中之前所做的循环次数。我想不出一种更简单的方法来检查每个号码是否与中奖号码匹配,而无需为每种情况花费一两个小时编写 if 语句。这是我的代码:
class chancesofLotterywin {
public static void main(String[] args){
//Quick Pick
double qp1 = 1;
double qp2 = 1;
double qp3 = 1;
double qp4 = 1;
double qp5 = 1;
double qp6 = 1;
double qp7 = 1;
//Winning Numbers
double win1 = 1;
double win2 = 1;
double win3 = 1;
double win4 = 1;
double win5 = 1;
double win6 = 1;
double win7 = 1;
for(int i = 0;;i++){
qp1 = Math.floor((Math.random()*50)+1);
qp2 = Math.floor((Math.random()*50)+1);
qp3 = Math.floor((Math.random()*50)+1);
qp4 = Math.floor((Math.random()*50)+1);
qp5 = Math.floor((Math.random()*50)+1);
qp6 = Math.floor((Math.random()*50)+1);
qp7 = Math.floor((Math.random()*50)+1);
win1 = Math.floor((Math.random()*50)+1);
win2 = Math.floor((Math.random()*50)+1);
win3 = Math.floor((Math.random()*50)+1);
win4 = Math.floor((Math.random()*50)+1);
win5 = Math.floor((Math.random()*50)+1);
win6 = Math.floor((Math.random()*50)+1);
win7 = Math.floor((Math.random()*50)+1);
if (qp1 == win1){
if (qp2 == win2){
if (qp3 == win3){
if (qp4 == win4){
if (qp5 == win5){
if (qp6 == win6){
if(qp7 == win7){
System.out.println(qp1 + " " + qp2 + " " + qp3 + " " + qp4 + " " + qp5 + " " + qp6 + " " + qp7);
System.out.println(win1 + " " + win2 + " " + win3 + " " + win4 + " " + win5 + " " + win6 + " " + win7 );
System.out.println(i);
break;
}else{}
}else if(qp6 == win7){
if(qp7 == win6){
System.out.println(qp1 + " " + qp2 + " " + qp3 + " " + qp4 + " " + qp5 + " " + qp6 + " " + qp7);
System.out.println(win1 + " " + win2 + " " + win3 + " " + win4 + " " + win5 + " " + win6 + " " + win7 );
System.out.println(i);
break;
}else{}
}else{}
}else if (qp5 == win6){
if (qp6 == win5){
}else if (qp5 == win7){
}else{}
}else if (qp4 == win5){
}else if (qp4 == win6){
}else if (qp4 == win7){
}else{}
}else if (qp3 == win4){
}else if (qp3 == win5){
}else if (qp3 == win6){
}else if (qp3 == win7){
}else{}
}else if (qp2 == win3){
}else if (qp2 == win4){
}else if (qp2 == win5){
}else if (qp2 == win6){
}else if (qp2 == win7){
}else{}
}else if(qp1 == win2){
}else if (qp1 == win3){
}else if (qp1 == win4){
}else if (qp1 == win5){
}else if (qp1 == win6){
}else if (qp1 == win7){
}else{}
/*if (((qp2 == win1) || (qp2 == win2) || (qp2 == win3) || (qp2 == win4) || (qp2 == win5) ||(qp2 == win6) || (qp2 == win7))){
if(((qp3 == win1) || (qp3 == win2) || (qp3 == win3) || (qp3 == win4) || (qp3 == win5) ||(qp3 == win6) || (qp3 == win7))){
if(((qp4 == win1) || (qp4 == win2) || (qp4 == win3) || (qp4 == win4) || (qp4 == win5) ||(qp4 == win6) || (qp4 == win7))){
if(((qp5 == win1) || (qp5 == win2) || (qp5 == win3) || (qp5 == win4) || (qp5 == win5) ||(qp5 == win6) || (qp5 == win7))){
if(((qp6 == win1) || (qp6 == win2) || (qp6 == win3 || (qp6 == win4) || (qp6 == win5) ||(qp6 == win6) || (qp6 == win7)))){
if(((qp7 == win1) || (qp7 == win2) || (qp7 == win3) || (qp7 == win4) || (qp7 == win5) ||(qp7 == win6) || (qp7 == win7))){
System.out.println("check 7");
System.out.println(qp1 + " " + qp2 + " " + qp3 + " " + qp4 + " " + qp5 + " " + qp6 + " " + qp7);
System.out.println(win1 + " " + win2 + " " + win3 + " " + win4 + " " + win5 + " " + win6 + " " + win7 );
System.out.println(i);
break;
}
}
}
}
}
}*/
}
}
}
}
很多都是不完整的,因为我不能被要求对每个场景都进行编码。注释掉的部分是我之前的解决方案,但它存在一个问题,即 1 个中奖号码等于多个快速选择号码。
有没有更简单的方法来做到这一点?另外请注意技术上的笨拙,我重新学习 Java 最多的是 do/while 循环。
解决方案
public class Main {
private static final Random random = new Random();
public static void main(String[] args) {
final var actual = listWithRandomNumbers();
for(int i = 0;;i++){
final var guess = listWithRandomNumbers();
//System.out.println(guess+" | "+actual);
if(guess.equals(actual)){
System.out.println(i);
break;
}
}
}
private static Set<Integer> listWithRandomNumbers() {
return Stream.generate(() -> random.nextInt(50) + 1)
.distinct()
.limit(7)
.collect(Collectors.toSet());
}
}
如果流吓到你
private static Set<Integer> listWithRandomNumbers() {
final var set = new HashSet<Integer>(7);
for (int i = 0; i < 7; i++) {
while(true){
final var randomNumber = Main.random.nextInt(50) + 1;
if(!set.contains(randomNumber)){
set.add(randomNumber);
break;
}
}
}
return set;
}
或者
private static Set<Integer> listWithRandomNumbers() {
final var set = new HashSet<Integer>(7);
while(true){
final var randomNumber = random.nextInt(50) + 1;
set.add(randomNumber);
if(set.size() == 7){
break;
}
}
return set;
}
推荐阅读
- wan - 如何让应用程序在广域网上工作
- react-native - React Native Auth0:“此请求的授权已被拒绝”
- mongodb - MongoDB Activating Authentication 将副本设置为 OTHER
- php - 检查 PHP setter 函数中的其他值
- c - 为什么该程序中接收输入的两个提示显示在同一行?
- c# - 如何在 jQuery 函数中找到剑道网格列?
- ios - 我需要在带有滚动的单个页面上一个接一个地创建两个视图(UICollectionView 和 UIScrollView),
- qt - Qt 应用程序之间通过 QProcess 进行通信
- java - 我需要使用布尔值 true 或 false 来告诉用户他/她的猜测是否正确
- api - Flutter:如何在不进行 API 调用的情况下重新渲染视图?