Java乐透模拟

时间:2012-11-21 16:35:04

标签: java arrays loops

我正在编写一个程序,模拟1到45之间六个数字的乐透画,样本输出是3 7 12 27 43 28.但我想要做的是计算相邻数字出现的次数,例如1 4 5 29 26 41是一个肯定的答案,因为5是在4之后。

这样做的最佳方式是什么?

我尝试了以下示例:

int adjacent=0;

    for(int i =0; i<6; i++)
    {
        int t = test[i]+1;
        test[i]=(int)(45*Math.random())+1;

        if(test[i]==t)
            adjacent++;

        System.out.print(test[i]+"    ");
    }

这不起作用。

我做错了什么?

4 个答案:

答案 0 :(得分:0)

我认为你应该洗牌并拿走任何五个。 Collections#Shuffle可以帮助您,它使用默认的随机源来置换指定的列表。所有排列都以大致相等的可能性发生。

List<Integer> list = ArrayList<Integer>();
list.add(1);
list.add(2);
Collections.shuffle(list);
Random rnd = new Random();
Integer[] result = new Integer[5];
result[0] = list.get(rnd.getNextInt(45));
result[1] = list.get(rnd.getNextInt(45));
result[2] = list.get(rnd.getNextInt(45));
result[3] = list.get(rnd.getNextInt(45));
result[4] = list.get(rnd.getNextInt(45));

它总是为您提供随机值,然后您应该对其进行排序以按顺序排列,比如提升。

Arrays.sort(result); 

现在你可以写一个循环找出相邻的数字。

int adjacent = 0;
for(int i=1; i<result.length;i++){
   int prev = result[i-1];
   int now = result[i];
   if(prev+1 == now)
    adjacent++;
}

答案 1 :(得分:0)

生成6个数字并将它们放入数组后。使用Arrays.sort()。然后,您可以比较相邻的数组条目。

您还应该避免使用Random来生成6个数字,因为它可以生成重复数据。这可能会也可能不会准确地模拟您的乐透画。 Quoi的回答对此有很好的建议。

答案 2 :(得分:0)

我认为你只是有一个操作顺序问题

int adjacent=0;

for(int i =0; i<6; i++)
{
    //test[i] hasn't been set yet
    int t = test[i]+1;
    test[i]=(int)(45*Math.random())+1;

    //this comparison doesn't make a whole lot of sense
    if(test[i]==t)
        adjacent++;

    System.out.print(test[i]+"    ");
}

将其更改为以下内容:

int adjacent=0;

for(int i =0; i<6; i++)
{
    test[i]=(int)(45*Math.random())+1;
    int t = -1;
    //Make sure this comparison only happens after the second iteration
    //to avoid index out of bounds
    if ( i != 0 ) 
    {
        //Set t to the last number + 1 instead of trying to predict the future
        t = test[i-1] + 1;
    }
    //Now this comparison makes a little more sense
    //The first iteration will compare to -1 which will always be false
    if(test[i]==t)
        adjacent++;

    System.out.print(test[i]+"    ");
}

这可以进一步简化为:

int adjacent=0;

for(int i =0; i<6; i++)
{
    test[i]=(int)(45*Math.random())+1;

    if(i != 0 && test[i]==(test[i-1]+1))
        adjacent++;

    System.out.print(test[i]+"    ");
}

答案 3 :(得分:0)

您需要将独特的生成(因此下面的HashSet)与随机选择分开,对它们进行排序,然后确定邻接:

import java.util.HashSet;
import java.util.Arrays;

public class Lotto 
{
    public Lotto()
    {

    }

    /**
     * @param args
     */
    public static void main(String[] args) 
    {
        Lotto lotto = new Lotto();
        lotto.randomizeSelections(5);
    }

    private void randomizeSelections(int numOfArrays)
    {
        for(int i = 0; i < numOfArrays; i++)
        {
            int[] selArry = new int[6];
            //to insure that each random selection is unique
            HashSet<Integer> idntySet = new HashSet<Integer>();

            for(int j = 0; j < 6;)
            {
                int rndm = (int)(45 * Math.random()) + 1;

                //add selection to the array only if it has not been randomized before
                if(!idntySet.contains(rndm))
                {
                    selArry[j] = rndm;

                    j++;
                }

            }

            //sort the array for determing adjacency
            Arrays.sort(selArry);

            for(int j = 0; j < 6; j++)
            {
                int sel = selArry[j];
                boolean isAdjcnt = (j > 0 && (sel == selArry[j - 1] + 1)) ? true : false;

                System.out.println(i + "." + j + ".random = " + sel);

                if(isAdjcnt) System.out.println("\tAdjacent");

            }
        }
    }
}