方法清单

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

之前我用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);}
}

运行结果:

这是我目前想到的五种方式,那么你觉得那种好用呢?
或者你有更好的方法,欢迎评论区补充,大家一起探讨一起学习!

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

  1. JAVA简单编写双色球随机摇号

    //双色球选号public static void main(String[] args) {Random ran = new Random();//实例化一个随机对象int a = ran.next ...

  2. Java中有几种方法可以实现一个线程??用什么关键字修饰同步方法??stop()和suspend()方法为什么不推荐使用??

    1. Java中有几种方法可以实现一个线程?? 两种,分别是继承thread类和实现Runnable类接口. 第一种: new Thread(){}.start();这表示调用Thread子类对象的r ...

  3. java 中有几种方法可以实现一个线程?用什么关键字修饰同步方法 ? stop() 和 suspend() 方 法为何不推荐使用?

    60 . java 中有几种方法可以实现一个线程?用什么关键字修饰同步方法 ? stop() 和 suspend() 方 法为何不推荐使用? 答: 有两种实现方法,分别是继承 Thread类与实现Ru ...

  4. java使用2种方法操作liberoffice把word转pdf,pdf加水印,java远程调用Linux执行命令

    文章目录 libreoffice下载地址 安装 (第一种) java调用 (第二种 推荐) java调用Linux命令转pdf java远程连接Linux执行命令(少数情况) linux安装windo ...

  5. 双色球随机选号器界面设计及功能实现

    文章目录 1 双色球随机选号器界面设计 1.1 双色球随机选号器界面设计 2 双色球随机选号器代码实现 2.1 项目文件结构 2.2 代码实现 1 双色球随机选号器界面设计 1.1 双色球随机选号器界 ...

  6. java数组36选7_36选7随机摇号

    import java.util.Random; public class RandomDemo { public static void main(String[] args) { lottery( ...

  7. python实现双色球_python实现双色球随机选号

    本文实例为大家分享了python实现双色球随机选号的具体代码,供大家参考,具体内容如下 双色球随机选号实现代码 from random import randrange, randint, sampl ...

  8. python双色球选号_python实现双色球随机选号

    本文实例为大家分享了python实现双色球随机选号的具体代码,供大家参考,具体内容如下 双色球随机选号实现代码 from random import randrange, randint, sampl ...

  9. 利用Java线程及JFrame面板制作一个随机摇号小程序

    很多都是自己写的,慢慢的尝试,里面改了很多次数 但是最后的结果是没有错的 最后的最后终于得到想要的结果 慢慢的训练总能得到训练的 加油!!!! 上代码: import java.awt.Color; ...

最新文章

  1. 自制树莓派“防松鼠神器”在Reddit火了,13行代码就能让AI替你护食,成本300+元...
  2. 【Java面试题】docker拉取镜像
  3. UIVIewController自定义切换效果-b
  4. 006 CSS三种引入方式
  5. PHP学级与年级的转换函数_PHP addslashes()和stripslashes():字符串转义与还原
  6. [资料]PHP中的__call使用
  7. JSP的隐含对象/隐藏对象/内置对象介绍
  8. 小白学算法:买卖股票的最佳时机!
  9. 如何将mysql中的表传到elipse中_eclipse怎么连接到MySQL中的表!!!!!
  10. C语言基础专题 - 数组(编辑中)
  11. python的类变量和成员变量用法_python中类变量和成员变量、局部变量总结
  12. 中国内蒙古医企在“吴哥国际医院”开展“千人一对一国际医疗捐助”
  13. springboot+爱心捐赠小程序 毕业设计-附源码211711
  14. 私域流量客服社群运营员工工作绩效表格方案计划手册指南宝典
  15. 服务器国产linux操作系统,国产linux操作系统适于做服务器系统的有哪些
  16. 【微分方程】微分算子法求微分方程特解
  17. k--最近邻算法(KNN)
  18. Flutter学习笔记 —— 完成一个简单的新闻展示页
  19. 简单快速删除流氓软件(包括注册表)
  20. android吸附菜单,Android RecycleView实现滑动停止后自动吸附效果

热门文章

  1. Linux开机过程概述
  2. 进网站显示无法进入服务器,关于无法进入服务器的解决办法
  3. JAVA ajax搜索框_JS+Ajax实现百度智能搜索框
  4. java类打成jar包(小游戏等)
  5. 图书管理系统Java(ArrayList版)
  6. laravel小札之Gate与Policy
  7. 基于matlab的跳频系统的仿真,基于MATLAB的跳频通信系统仿真
  8. layui横向时间线_一些不起眼但又非常的实用的PPT制作技巧,大大节省PPT制作时间...
  9. 【22SR】Practical Blind Denoising via Swin-Conv-UNet and Data Synthesis
  10. 时间戳 和 日期 转换的方法