1

我正在编写一个程序,模拟 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

4 回答 4

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");

            }
        }
    }
}
于 2012-11-21T16:59:15.870 回答
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]+"    ");
}
于 2012-11-21T16:45:03.480 回答
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++;
}
于 2012-11-21T16:37:56.320 回答
0

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

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

于 2012-11-21T16:38:44.793 回答