1

私は1から45までの6つの数字の宝くじ抽選をシミュレートするプログラムを書いています。サンプル出力は3712 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

私はあなたがそれをシャッフルして、5つを取るべきだと思います。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()ます。次に、隣接する配列エントリを比較できます。

また、重複を生成する可能性があるため、ランダムを使用して6つの数値を生成することは避けてください。これは、宝くじの抽選を正確にシミュレートする場合としない場合があります。Quoiの答えはこれに対する良い提案を持っています。

于 2012-11-21T16:38:44.793 に答える
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

一意の(したがって、アイデンティティを保証するために以下の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 に答える