Java,彩票计算器

时间:2010-07-13 10:22:24

标签: java combinations permutation

好的,我真的很无聊,并决定制作彩票计算器类型的东西(是的,我知道,我很伤心!)

无论如何,我想知道是否有用于解决排列/组合的java库方法/类。我想生成所有可能的数字集,从1到49有6个数字,其中没有重复

如果这不作为预先编写的方法提供,那么我最好的方法是自己编写吗?

谢谢

5 个答案:

答案 0 :(得分:3)

粗略估计:

49 * 48 * 47 * 46 * 45 * 44 = 10.068.347.520

这是包含所有可能组合的列表的长度。请注意,您不能使用ArrayList,因为它由数组支持,并且数组的最大大小限制为Integer.MAX_VALUE。即使您使用byte数组来存储100亿个组合,也应该像这样启动jvm:

java -Xmx250G my.little.LotteryGenerator

(假设你有足够的内存)

答案 1 :(得分:2)

这是我的第二个答案。这是编写此问题的一种愚蠢但简单的方法(在Java中):

for (int i1=1; i1<45; i1++) {
   for (int i2=i1+1; i2<46; i2++) {
      for (int i3=i2+1; i3<47; i3++) {
         for (int i4=i3+1; i4<48; i4++) {
            for (int i5=i4+1; i5<49; i5++) {
               for (int i6=i5+1; i6<50; i6++) {
                  System.out.format("%d %d %d %d %d %d\n", i1, i2, i3, i4, i5, i6);
}}}}}}

答案 2 :(得分:1)

很抱歉意大利面条代码和可怕的变量命名(我一直熬到凌晨3点)用Java编写我自己的彩票程序,但是现在你去了

 public static void LottoNumbers()
        {

          int zero=0;
 int one=0;
 int two=0;
 int three=0;
 int four=0;
 int five=0;
 int six=0;
 int bonus = 0;
 int bonusball=0;
            ArrayList myNumbers = new ArrayList();
            Random random2 = new Random();

            ArrayList ResultsList = new ArrayList<results>();
            ArrayList numberList = new ArrayList();

            for (int outer = 0; outer < 140000001; outer++)
            {
                myNumbers.clear();
                for (int i = 1; i < 7; i++)
                {
                    boolean a = true;
                    while(a)
                    {
                    int r = random2.nextInt();
                    if (!myNumbers.contains(r)) {
                        myNumbers.add(random2.nextInt(49) +1);
                        a = false;
                    }
                    }
                }
                numberList.clear();
                for (int i = 1; i < 7; i++)
                {
                    boolean a = true;
                    while (a)
                    {


                        Random random = new Random();
                        int r = random.nextInt(49) +1;
                        if (!numberList.contains(r))
                        {
                            numberList.add(r);
                            a = false;
                        }
                    }
                }
                Random random = new Random();
                boolean b = true;
                while(b)
                {
                int bb = random.nextInt(49) +1;
                if (!numberList.contains(bb))
                {
                    bonusball = bb;
                    b = false;
                }
                }

                int matches = 0;
                for (int u =0; u<numberList.size(); u++)
                {
                    if (myNumbers.contains(numberList.get(u)))
                    {
                        matches++;
                    }
                }
                if (matches == 0)
                        zero++;
                    if (matches == 1)
                        one++;
                    if (matches == 2)
                        two++;
                    if (matches == 3)
                        three++;
                    if (matches == 4)
                        four++;
                    if (matches == 5)
                        five++;
                    if (matches== 5 && myNumbers.contains(bonusball))
                        bonus++;
                    if (matches == 6) {
                        six++;

                             System.out.println("Jackpot! " + numberList.get(0)
                                     +"," + numberList.get(1)
                                     +"," + numberList.get(2)
                                     +"," + numberList.get(3)
                                     +"," + numberList.get(4)
                                     +"," + numberList.get(5));
                    }


if (outer%500000==0) {
                        System.out.println("none: " + zero + " one: " + one + " two: " + two + " three: " + three + " four: " + four +
                        " five: " + five + " 5+bonus: " + bonus + " six: " + six + " total: " + outer);
}

我的初步理论是针对我自己选择的6个数字运行6个随机数。但我发现随机数发生器有点不可靠,1,2,3,4,5,6会赢得一百万左右,有时甚至更多!但我随后决定随机生成我的数字,我发现的结果非常准确,至少在一个获胜的(英国)6个匹配数字的集合中大约每1400万次迭代出现一次。

我很感兴趣的是,每个组合应该在1400万次出现一次,并希望进行1.4亿次抽奖并查看哪些数字最多。当我意识到存储所有数据会让人头疼时,我放弃了。所以我只是插入了一些打印行来输出总数(即5匹配)和发生的任何累积奖金。本周末可能会帮我挑几个号码!

在任何人开枪之前,我是一个新的热情的程序员,并知道这有点乱,但它只是为了好玩:)

编辑:程序刚刚完成了第1.4亿次循环,并且有10个累积奖金!

答案 3 :(得分:0)

Google对“permutations java”发现了this

玩得开心!

答案 4 :(得分:0)

如果你这样做是为了好玩,你不应该从头开始吗?

有想象力代码的额外积分?看起来像是尝试递归的理想机会。

getPermitations(长度) { result = new Vector tmp = getPermitations(lenght-1)

for(i = 0 =&gt; 9) { for(String s:tmp) {   result.add(i + tmp); } }

}

是的,我知道这不是正常工作的代码,复制别人工作代码的乐趣在哪里?

然后玩优化它以获得额外的分数。