Java用n种方法编写实现双色球随机摇号案例

article/2025/8/31 3:23:56

方法清单

  • 规则
    • 实现方式一
    • 实现方式二
    • 实现方式三
    • 实现方式四
    • 实现方法五

之前我用JavaScript编写过一个实现双色球随机摇号的案例, 点击此处查看,今天我再用Java语言来实现这一效果。

规则

那么首先我们要搞清楚规则是什么:

双色球投注区分为红球号码区和蓝球号码区
红球号码范围为01~33,蓝球号码范围为01~16
双色球每期从33个红球中开出6个号码,从16个蓝球中开出1个号码作为中奖号码
双色球玩法即是竞猜开奖号码的6个红球号码和1个蓝球号码,顺序不限

简单来说,就是通过随机,红球就是在1~33中随机出来6个互不相同的数字,蓝球则是产生一个1 ~16之间的数字。那么难点当然在于红球,如何确保不重复呢?

实现方式一

当然是用集合了,因为集合的性质就在于,里面的元素互不重复。接下来我们就用集合来实现:

package day_11_25;import java.util.HashSet;
import java.util.Random;
import java.util.Set;/*** 双色球* 红球1~33  篮球1~16** @author soberw*/
public class DoubleBall2 {public static void main(String[] args) {Random random = new Random();Set<Integer> red = new HashSet<Integer>();do {red.add(random.nextInt(33) + 1);} while (red.size() != 6);System.out.print("{ ");red.forEach((value) -> {System.out.printf("[%02d] ", value);});System.out.print("}");System.out.printf("{ [%02d] }", random.nextInt(16) + 1);}
}

运行结果:
在这里插入图片描述

实现方式二

那么如果不用集合而用数组呢?我们都知道Java的数组比较死板,就是一旦定义,就不能再更改长度,而且在声明的时候一定要指定长度或者初始化值。那么如果想用数组实现呢,代码如下:

package day_11_25;import java.util.Random;/*** 双色球* 红球1~33  篮球1~16** @author soberw*/
public class DoubleBall3 {public static void main(String[] args) {Random random = new Random();//放红球int[] red = new int[6];for (int i = 0; i < red.length; i++) {boolean flag = true;int redRAn = random.nextInt(33) + 1;while (flag) {for (int j = 0; j < red.length; j++) {if (red[j] == redRAn) {flag = false;break;}}if (flag) {red[i] = redRAn;break;}}}System.out.print("{ ");for (int i : red) {System.out.printf("[%02d] ", i);}System.out.print("}");System.out.printf("{ [%02d] }", random.nextInt(16) + 1);}
}

运行结果:
在这里插入图片描述

实现方式三

其实用数组的实现方式有很多,上面这种采用了三重循环嵌套,如果逻辑性不强,很难理解为什么这样子写,下面分享另一种写法,相比于上一种写法,这种的思路是创建一个基数数组base存放1~33所有的号码球,每次随机抽取出一个,然后将base 中对应号码球的赋值为0,每次抽取的时候都会先判断是不是为0,如果是0就说明已经被抽走了,那么就继续随机,直到不再重复为止。确保不会重复:

package day_11_25;import java.util.Random;/*** 双色球* 红球1~33  篮球1~16** @author soberw*/
public class DoubleBall {public static void main(String[] args) {Random ran = new Random();//基数组,从这里抽数放入redint[] base = new int[33];//存放红球int[] red = new int[6];int ranIndex;//给base元素依次赋值1~33for (int i = 1; i <= base.length; i++) {base[i - 1] = i;}for (int i = 0; i < red.length; i++) {while (true) {//随机base的下标ranIndex = ran.nextInt(33);//判断是不是被抽走了,被抽走了就继续随机,没有的话就放入red,并将base中对应的赋值为0if (0 != base[ranIndex]) {red[i] = base[ranIndex];base[ranIndex] = 0;break;}}},System.out.print("{ ");for (int i : red) {System.out.printf("[%02d] ", i);}System.out.print("}");System.out.printf("{ [%02d] }", ran.nextInt(16) + 1);}
}

运行结果:
在这里插入图片描述

实现方式四

当然我们也可以借助数组工具类Arrays中的二分查找方法 binarySearch()来判断是否已经存在,但是前提是必须在查找前先排序,因为二分查找的前提就是要确保数组是有序的:

package day_11_25;import java.util.Arrays;
import java.util.Random;/*** 双色球* 红球1~33  篮球1~16** @author soberw*/
public class DoubleBall4 {public static void main(String[] args) {Random random = new Random();//放红球int[] red = new int[6];Arrays.fill(red,33);//存放号码球int ranRed;for (int i = 0; i < red.length; i++) {boolean flag = true;//确保数组有序Arrays.sort(red);while (flag) {ranRed = random.nextInt(33) + 1;//判断数组中是否存在此元素if (Arrays.binarySearch(red, ranRed) < 0) {flag = false;red[i] = ranRed;}}}System.out.print("{ ");for (int i : red) {System.out.printf("[%02d] ", i);}System.out.print("}");System.out.printf("{ [%02d] }", random.nextInt(16) + 1);}
}

运行结果:
在这里插入图片描述

这里需要注意一点,Arrays.binarySearch()方法如果找不到元素,返回的不是-1,而是一个小于0的数,这个数是多少呢,查看API手册得知:
在这里插入图片描述
我在使用的时候就栽过坑,让其等-1,结果陷入死循环。。。

实现方法五

那么上一个方法存在的问题就是,每次判断之前我还要对数组进行排序,虽然这是内置的算法不用我们自己在写了,但是总感觉还是有待优化一下。于是,就有了第五种方法:)
使用Vector类完成,它的优势在于,它是动态的,可以动态添加数据,最主要的是,它内置了超级多的方法,相比于原始数组的死板,实在是强大许多:

package day_11_25;import java.util.Random;
import java.util.Vector;/*** 双色球* 红球1~33  篮球1~16** @author soberw*/
public class DoubleBall5 {public static void main(String[] args) {Random random = new Random();//声明一个空数组用于存放红球Vector<Integer> red = new Vector<Integer>();//超出六个退出while (red.size() < 6) {int ranRed = random.nextInt(33) + 1;//如果不存在则添加if (!red.contains(ranRed)) {red.add(ranRed);}}System.out.print("{ ");for (int i : red) {System.out.printf("[%02d] ", i);}System.out.print("}");System.out.printf("{ [%02d] }", random.nextInt(16) + 1);}
}

运行结果:
在这里插入图片描述
这是我目前想到的五种方式,那么你觉得那种好用呢?
或者你有更好的方法,欢迎评论区补充,大家一起探讨一起学习!


http://chatgpt.dhexx.cn/article/HQMPIqV5.shtml

相关文章

抽奖摇号系统随机性算法介绍

参考视频教程: **高并发高性能 Go语言开发企业级抽奖项目 ** 摘要 本文分析GO语言包中的"crypto/rand"和"math/rand"&#xff0c;芯链HPB系统的区块链随机数&#xff0c;并给出了权衡效率和随机性&#xff0c;并给出了一款区块链摇号抽奖系统如何…

Windows 安装 JDK-11

目标 在 windows 上安装 JDK-11 安装 下载 JDK 安装包 地址下载https://download.csdn.net/download/m0_47406832/83449704 解压 安装 运行 jdk-11.0.11_windows-x64_bin.exe 程序&#xff0c; 许可安装请求 等待环境检测 开始安装 选择安装目录 接下来一路下一步&…

Win10安装JDK11(超详细)

目录 一、下载JDK二、安装JDK三、配置环境变量四、检查是否安装成功五、JDK中没有jre文件 一、下载JDK JDK11下载地址&#xff1a; Java SE Development Kit 11.0.19 下图是JDK11下载界面&#xff1a; 其中.exe后缀的是安装版本&#xff0c;需要手动设置安装路径进行安装&am…

JDK11安装-macos

JDK 概述 JDK 全称 Java Development ToolKit&#xff0c;是 Java 语言开发工具包。JDK 是整个 JAVA 的核心&#xff0c;包括了 Java 运行环 境&#xff08;Java Runtime Environment&#xff09;&#xff0c;一堆 Java 工具&#xff08;javac/java/jdb 等&#xff09;和 Java…

jdk9、jdk10、jdk11、jdk12、jdk13新特性

我们绝大部分人估计都还在用着jdk8&#xff0c;12其实是一个非LTS&#xff08;long time support&#xff09;版本&#xff0c;而11与8一样是LTS版&#xff0c;意味着下个通用的版本将从8直接到11&#xff0c;毕竟11包含了9和10的所有新特性&#xff0c;因此9和10估计就直接被废…

window11安装JDK1.8【jdk-8u121】

&#x1f469;‍&#x1f4bb;博客主页&#xff1a;大家好我是poizxc2014的博客主页 ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f4d6;个人主页&#xff1a;poizxc2014的博客_CSDN博客-数据库,mysql,java领域博主 &#x1f4bb;首发时间&#xff1a;&#…

JDK11 新特性详解

1、增强局部变量类型推断 var Consumer<String> consumer t -> System.out.println(t.toUpperCase()); Consumer<String> consumer (var t) -> System.out.println(t.toUpperCase());错误的形式&#xff1a;必须要有类型&#xff0c;可以加上var Consumer…

JDK11安装教程(WIN10)

文章目录 前言一、Java是什么&#xff1f;二、搭建Java环境1.下载2.安装3.配置环境变量4.检验是否安装成功 总结 前言 从毕业到工作已经快一年了&#xff0c;这一年来&#xff0c;公司给我的发展方向是项目经理&#xff0c;但是第一&#xff0c;工作地点离家太远&#xff1b;第…

【JDK】win 10 / win 11:jdk 8 下载、安装、配置、验证

目录 一、下载 JDK &#xff08;1&#xff09;官网下载 JDK 最新版本 &#xff08;2&#xff09;官网下载 JDK 历史版本&#xff08;示例 Java 8&#xff09; 二、安装 JDK &#xff08;1&#xff09;新建安装目录 jdk 和 jre &#xff08;2&#xff09;启动安装程序 &a…

【JDK】win 10 / win 11:jdk 8 升级为 jdk 17

目录 一、前言 二、历史版本 Java 安装 三、最新版本 Java 安装 &#xff08;1&#xff09;历史版本作废 &#xff08;2&#xff09;最新版本沿用旧版 JDK 系统环境变量 &#xff08;3&#xff09;JDK 17 下载 &#xff08;4&#xff09;JDK 17 安装 &#xff08;5&am…

Windows下安装JDK11(详细版)

简介 在JDK1.8之后的下一个稳定版本就是JDK11&#xff0c;所以下面教大家安装JDK11 第一步:下载 官网下载地址[https://www.oracle.com/java/technologies/javase-jdk11-downloads.html] 拉至页面到底部&#xff0c;选择如下版本下载&#xff0c;然后它可能要Oracle帐号才能…

Windows下安装JDK11(详细)

文章目录 一、简介第一步&#xff1a;下载第二步&#xff1a;安装第三步&#xff1a;设置环境变量第四步&#xff1a;生成 jre 文件第五步&#xff1a;检查是否成功 一、简介 因为JDK1.8版本已经不维护且比较老&#xff0c;故选用下一个稳定的版本&#xff0c;即JDK11。 第一…

win10安装jdk11

win10安装jdk11 jdk11下载与安装下载手动安装免安装配置系统环境变量检测是否安装成功 切换jdk版本 jdk11下载与安装 下载 1.第一步&#xff0c;前往oracle官网下载jdk11 oracle官方下载地址 2.选择要下载的jdk x64 Installer&#xff1a;这个是需要手工安装的版本 x64 Com…

jdk11下载与安装教程(win10)超详细

一、下载安装步骤 1、官网下载还需要注册&#xff0c;可以点【我的网盘】目录下载&#xff0c;密码3360&#xff0c;目录也有其它低版本的&#xff0c;如果有需要大家根据需要自行选择。 2、下载后直接点击安装程序&#xff0c;点击【运行】。这里我使用的是64位的。 3、点击【…

JDK11下载安装、JRE生成、环境配置

一、 下载 JDK11官网下载&#xff1a; Java SE - Downloads | Oracle Technology Network | Oracle 选择自己合适的版本。 二、安装 三、生成JRE 1、安装目录 找到jdk的安装目录 2、jdk11安装目录里面我们可以看到是没有jre的&#xff0c;但是我们在之后可能是会需要用到…

JDK11下载与安装 win10 64位

Java11 为LTS(长期支持)版本。 1.下载JDK11 建议直接找安装包&#xff0c;不要去官网下载。 下面是 jdk11的下载地方 方法1&#xff1a;百度网盘链接&#xff1a;https://pan.baidu.com/s/11yQTrDv653hceNA-wfcFsg 提取码&#xff1a;qgfk 方法2&#xff1a;阿里云盘&#xff1…

2020年最新 java JDK 11 下载、安装与环境变量配置教程

java JDK11下载、安装与环境变量配置 一、下载步骤 首先明确自己的操作系统&#xff08;本次配置jdk操作系统&#xff1a;Windows 10 家庭中文版&#xff09; 下载地址&#xff1a;点击跳转 点击进入下载地址后我们可以看见目前&#xff08;2020/8/15&#xff09;最新版本是…

Win10安装jdk11及环境变量配置

Win10安装jdk11及环境变量配置 写在前面卸载旧版本jdk下载jdk11配置环境变量经验教训 写在前面 我第一次安装java是在17年初&#xff0c;距离现在已经一年半了。今天上oracle官网一看&#xff0c;jdk都已经更新到11.0.1了&#xff0c;然而我用的还是1.8.0_171版本的老古董&…

jdk11下载、安装及环境配置详解(win10环境)

目录 一、jdk11下载1.1、官网下载网址1.2、官网下载步骤 二、jdk11安装&#xff08;win10环境&#xff09;三、jdk11环境变量配置&#xff08;win10环境&#xff09;3.1、jdk11环境变量配置步骤3.2、jdk11环境变量验证步骤 一、jdk11下载 1.1、官网下载网址 https://www.orac…

JDK11 下载与安装、环境配置(全网最详情,值得收藏)

目录 一、下载JDK11 二、安装JDK11 三、配置环境变量 四、验证环境配置是否成功 五、答疑&#xff0c;为什么不配置 CLASSPATH 什么是JDK JDK是 Java 语言的软件开发工具包&#xff0c;主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心&#xff0…