前言
首先说明一下,博主是没有能力预测双色球的,只是看最近支付宝、京东等客户端均有随机选彩票(双色球)的功能,想着模拟实现一下这个随机选号的算法。
之前看到有人说博主比较乐观,都是咬牙坚持的,博主也各种屌死,各种幻想,例如中了双色球一等奖开着宝马去阿里写代码,哈哈,我还是挺喜欢写代码的。(ps:真蛋疼,大论文还没写完,在这里搞神马双色球啊)
双色球随机算法思路
最近我每周也会买一注双色球,玩了2期之后,知道红球是33选6,蓝球是16选1,因此中奖的概率为:1 / (C(6, 33) × C(1, 16)) = 1 / 17721088 。好久没搞概率了,这么简单的概率题目,应该没算错。
以33选6为例子,我们的算法只需要模拟如下的过程:
- 初始化数组,数组内容为:[1...33]
- 从数组下标1到33中随机选取一个下标,例如7,则交换下标为7和当前最后一位的数(即下标为32),将下标为7的数放入结果数组中
- 再从数组下标1到32中随机选取一个数,交换该数和倒数第二位数的位置
- ......
- 直到6个数均选出为止
至于Rondom类大家可以用java自带的Random类即可,提供一个种子,估计客户端都是用的时间戳,这里我也用时间戳,大家还可以考虑生日神马的。
双色球随机算法
import java.util.ArrayList;
import java.util.Random;
/**
* 双色球随机算法类
*
* @author zhengyi.wzy
*
*/
public class DoubleBall {
public static void main(String args[]) {
// 获取红球
ArrayList<Integer> redBalls = getBalls(1, 33, 6);
// 获取蓝球
ArrayList<Integer> buleBalls = getBalls(1, 16, 1);
// 打印输出
System.out.println("本期双色球中奖号码为:" + redBalls + ", " + buleBalls);
}
private static ArrayList<Integer> getBalls(int min, int max, int size) {
ArrayList<Integer> result = new ArrayList<Integer>();
ArrayList<Integer> stores = new ArrayList<Integer>();
for (int i = min; i <= max; i++) {
stores.add(i);
}
for (int i = 0; i < size; i++) {
int index = getRandomIndex(stores.size() - i);
result.add(stores.get(index));
swapNumbers(stores, index, stores.size() - i - 1);
}
return result;
}
private static int getRandomIndex(int max) {
Random random = new Random(System.currentTimeMillis());
return random.nextInt(max);
}
private static void swapNumbers(ArrayList<Integer> stores, int index, int last) {
int tmp = stores.get(index);
stores.set(index, stores.get(last));
stores.set(last, tmp);
}
}
后记
实验了几组数据,还是能够很好的保持随机性的,哈哈,其实我也就是写不进论文去,然后突然想写个双色球的随机算法,大家平时还是要靠自己的坚持努力获取别人的认可,双色球这种东西有人说是一种低智商税,我感觉可以作为生活中的小调味剂,和女友一起买一注,然后讨论一下中大奖以后的生活,还是挺美好。当然了,买完了该加班加班,该写代码继续写代码,博主继续写论文去了。
对了,我这期买的号码就是用这个算法随机算出来的:
本期双色球中奖号码为:[22, 17, 23, 4, 12, 20], [9]
大家如果用这个算法中奖了,可别忘了请我吃顿饭哈。