2

私は検索しましたが、私の問題に対する答えが見つかりません。宝くじタイプのシミュレーションを作成する必要があります。6 つの数字 + 重複のないボーナス番号です。私はなんとかそれを機能させましたが、6つの数値配列では、位置[1]の数値は常に0として表示されます。単純な問題だと確信していますが、私はこれにまったく慣れていないので、どんな助けも感謝して受け入れられます.以下のコード、私はそれがいたるところにあると確信しています........

import java.util.Arrays;

public class Lotto {

    public static void main(String[] args) {

        int[] Lotto=new int[6];
        final int MIN = 1;
        final int MAX = 45;

        for (int i = 0; i< Lotto.length; ++i)
        {

            Lotto [0] =MIN+ (int)(Math.random()*((MAX -MIN)+1));

            while (Lotto[1] == Lotto[0])
            {
                Lotto[1] =MIN+ (int)(Math.random()*((MAX -MIN)+1));
            }

            while ((Lotto[2] == Lotto[0]) || (Lotto[2] == Lotto[1]) )
            {
                Lotto[2] = MIN+ (int)(Math.random()*((MAX -MIN)+1));

            while ((Lotto[3] == Lotto[0]) || (Lotto[3] == Lotto[1]) || (Lotto[3] == Lotto[2]) )
            {
                Lotto[3] = MIN+ (int)(Math.random()*((MAX -MIN)+1));
            }

            while  ((Lotto[4] == Lotto[0]) || (Lotto[4] == Lotto[1]) || (Lotto[4] == Lotto[2]) ||   (Lotto[4] == Lotto[3]) )                        

            {
                Lotto[4] = MIN+ (int)(Math.random()*((MAX -MIN)+1));



                while  ((Lotto[5] == Lotto[0]) || (Lotto[5] == Lotto[1]) || (Lotto[5] == Lotto[2]) ||   (Lotto[5] == Lotto[3])||    (Lotto[5] == Lotto[4])) 

                {
                    Lotto[5] = MIN+ (int)(Math.random()*((MAX -MIN)+1));
                }


                int[] BonusNumber=new int[1];
                for (int j = 0; j< BonusNumber.length; ++j)
                {

                    BonusNumber [j] =1+ (int)(Math.random()*((45 -1)+1));
                }

                System.out.println("Winner  "  + Arrays.toString(Lotto));
                System.out.println("Bonus Number" +Arrays.toString(BonusNumber));   
            {


    }
            }
            }
        }
    }
}
4

5 に答える 5

5

このループを変更します。

while (Lotto[1] == Lotto[0])
{
    Lotto[1] = random(MIN, MAX);
}

の中へ:

do {
    Lotto[1] = random(MIN, MAX);
} while (Lotto[1] == Lotto[0]);

それに応じて、コードの残りの部分。問題がどこにあるかわかりますか?

しかし、非常に複雑で保守が困難なコードを書き直す前に、この実装を確認してください。これは理解しやすく、... 正しいです:

final int MIN = 1;
final int MAX = 45;

final List<Integer> allPossible = new ArrayList<Integer>(MAX - MIN + 1);
for (int i = MIN; i <= MAX; ++i) {
    allPossible.add(i);
}
Collections.shuffle(allPossible);
final List<Integer> lotto = allPossible.subList(0, 6);
int bonusNumber = allPossible.get(6);

System.out.println("Winner  "     + lotto);
System.out.println("Bonus Number" + bonusNumber);

Collections.shuffle()ここで重要です。

于 2013-01-08T20:31:16.387 に答える
3

あなたのコードは非常に紛らわしいと思いますがCollections.shuffle()、次の例のようないくつかの API ユーティリティを使用することで、多くの条件を回避できます。

public static void main(String[] args) 
{
    Integer[] numbers = new Integer[45];

    // Populating numbers.
    for (int i = 0; i < 45; i++)
        numbers[i] = i + 1;

    // Shuffling them to make them in random order.
    List<Integer> list = Arrays.asList(numbers);
    Collections.shuffle(list);

    // Print any 6 of them. I chose first 6 ones for simplicity.
    for (int i = 0; i < 6; i++)
        System.out.print(list.get(i) + " ");
}

出力例:

15 11 31 2 5 38 
于 2013-01-08T20:35:34.320 に答える
2

HashSet順序も重複も保持しないa を使用できます。

java.util.Random新しい乱数が必要になるたびに、クラスの新しいインスタンスを作成することもできます。これにより、シードが変更され、アプリケーションのランダム性が高まり、毎回 0 を含む位置 1 が削除されます。

new java.util.Random().nextInt(int max)

于 2013-01-08T20:28:02.347 に答える
1

組み込みクラスではなく int[] を使用する場合は、実行できます

int[] ints = new int[45];
for (int i = 0; i < ints.length; i++) ints[i] = i + 1;
Random rand = new Random();
for (int i = 0; i < 6; i++) {
    int swap = rand.nextInt(ints.length - i) + i;
    int tmp = ints[i];
    ints[i] = ints[swap];
    ints[swap] = tmp;
}
int[] drawn = Arrays.copyOf(ints, 6);
System.out.println(Arrays.toString(drawn));

版画

[19, 22, 24, 6, 34, 23]
于 2013-01-08T20:49:46.527 に答える
0

私はあなたと同じ入門 Java クラスを使用していると思います (そのプログラムは不気味に見慣れているように見えます)。ただし、私はあなたのプログラムから元のコードをすべてコピーしたので、基本的にすべての作業を行ったので、少しクリーンアップしました。

これは完全なプログラムです (数字のセットをランダム化 (繰り返しのチェック)、ユーザーがセットを選択またはランダム化 (繰り返しのチェックも) できるようにし、2 つのセットを並べ替えて比較し、勝ったかどうかをユーザーに通知します) 、もう一度再生するように求めます:

import java.util.*;
    public class Lotto
    {
    public static void main(String[] args)
    {        
        Scanner keyboard = new Scanner(System.in);
        Random rand = new Random();
        boolean checkPlay = false, readInput = false;
        final int MAX = 45;

        while (readInput != true)
        {
            System.out.print("Would you like to buy a lotto ticket? [y/n] ");
            String stBuyTicket = keyboard.nextLine().trim().toLowerCase();

            if (stBuyTicket.isEmpty())
            {
                System.out.println("Invalid Input.");
            }
            else if (stBuyTicket.charAt(0) == 'y' || stBuyTicket.charAt(0) == 'n')
            {
                if (stBuyTicket.charAt(0) == 'y')
                {
                    checkPlay = true;
                }
                else
                {
                    checkPlay = false;                    
                }
                readInput = true;
            }
            else
            {
                System.out.println("Invalid Input.");
            }
        }        
        while (checkPlay == true)
        { 
            int[] lotto = new int[6];
            int lottoLength = lotto.length;
            int[] userLotto = new int[6];
            int userLottoLength = userLotto.length;
            for (int i = 0; i < lottoLength; i++)
            {
                boolean checkLotto = false;
                while (checkLotto != true)
                {  
                    int numCheck = (rand.nextInt(MAX) + 1);
                    boolean confirmSame = false;
                    for (int j = 0; j <= i; j++)
                    {
                        if (numCheck == lotto[j])
                        {
                            confirmSame = true;
                        }
                    }
                    if (confirmSame != true)
                    {
                        lotto[i] = numCheck;
                        checkLotto = true;                                               
                    }
                }
            }            
            readInput = false;
            while (readInput != true)
            {
                System.out.println("Would you like choose your own numbers or just randomize them?");
                System.out.print("Choose your own numbers? [y/n] ");            
                String stBuyTicket = keyboard.nextLine().trim().toLowerCase();
                if (stBuyTicket.isEmpty())
                {
                    System.out.println("Invalid Input.");
                }
                else if (stBuyTicket.charAt(0) == 'y' || stBuyTicket.charAt(0) == 'n')
                {
                    if (stBuyTicket.charAt(0) == 'y')
                    {
                        for (int i = 0; i < userLottoLength; i++)
                        {
                            boolean checkUserLotto = false;
                            while (checkUserLotto != true)
                            {
                                System.out.print("Which number would you like to choose for number " + (i + 1) + ": ");
                                String numUserInput = keyboard.nextLine().trim();

                                int numUserInputLength = numUserInput.length();
                                boolean checkInput = true;
                                if (numUserInputLength > 2 || numUserInputLength < 1)
                                {
                                    System.out.println("Invalid Input. Try again.");
                                    checkInput = false;
                                }
                                else
                                {
                                    for (int j = 0; j < numUserInputLength; j++)
                                    {
                                        if (Character.isDigit(numUserInput.charAt(j)) != true)
                                        {
                                            System.out.println("Invalid Input. Try again.");
                                            checkInput = false;
                                        }
                                    }
                                }
                                if (checkInput == true)
                                {
                                    int userInput = Integer.parseInt(numUserInput);
                                    if (userInput > MAX || userInput < 1)
                                    {
                                        System.out.println("Invalid Input. Try again.");
                                    }
                                    else
                                    {
                                        boolean confirmSame = false;
                                        for (int j = 0; j <= i; j++)
                                        {
                                            if (userInput == userLotto[j])
                                            {
                                                System.out.println("You've already choosen this number. Choose again.");
                                                confirmSame = true;
                                            }
                                        }
                                        if (confirmSame != true)
                                        {
                                            userLotto[i] = userInput;
                                            checkUserLotto = true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        for (int i = 0; i < userLottoLength; i++)
                        {                            
                            boolean checkLotto = false;
                            while (checkLotto != true)
                            {  
                                int numCheck = (rand.nextInt(MAX) + 1);
                                boolean confirmSame = false;                                
                                for (int j = 0; j <= i; j++)
                                {
                                    if (numCheck == userLotto[j])
                                    {
                                        confirmSame = true;
                                    }
                                }
                                if (confirmSame != true)
                                {
                                    userLotto[i] = numCheck;
                                    checkLotto = true;                                               
                                }
                            }
                        } 
                    }
                    readInput = true;
                    System.out.print("Your lotto numbers are: " + userLotto[0]);
                    for (int i = 1; i < userLottoLength; i++)
                    {
                        System.out.print(", " + userLotto[i]);
                    }
                    System.out.print("!");
                    System.out.println();

                    System.out.print("And the winning lotto numbers are: " + lotto[0]);
                    for (int i = 1; i < lottoLength; i++)
                    {
                        System.out.print(", " + lotto[i]);
                    }
                    System.out.print("!");
                    System.out.println();

                    Arrays.sort(lotto);
                    Arrays.sort(userLotto);

                    if (Arrays.equals(userLotto, lotto) == true)
                    {
                        System.out.println("Your lotto numbers match the winning lotto numbers! \nYou win!");
                    }
                    else
                    {
                        System.out.println("Your lotto numbers do not match the winning lotto numbers. \nYou lose.");
                    }
                }
                else
                {
                    System.out.println("Invalid Input.");
                }
            }
            readInput = false;
            while (readInput != true)
            {
                System.out.print("Would you like to buy another lotto ticket? [y/n] ");
                String stBuyTicket = keyboard.nextLine().trim().toLowerCase();

                if (stBuyTicket.isEmpty())
                {
                    System.out.println("Invalid Input.");
                }
                else if (stBuyTicket.charAt(0) == 'y' || stBuyTicket.charAt(0) == 'n')
                {
                    if (stBuyTicket.charAt(0) == 'y')
                    {
                        checkPlay = true;
                    }
                    else
                    {
                        checkPlay = false;
                    }
                    readInput = true;
                }
                else
                {
                    System.out.println("Invalid Input.");
                }
            }
        }
        System.out.println("That's a good decision. Save your money");
        System.exit(0);
    }
}

以下は、繰り返しなしで宝くじセットをランダム化する部分です。

for (int i = 0; i < lottoLength; i++) {
                boolean checkLotto = false;
                while (checkLotto != true) {  
                    int numCheck = (rand.nextInt(MAX) + 1);
                    boolean confirmSame = false;
                    for (int j = 0; j <= i; j++) {
                        if (numCheck == lotto[j]) {
                            confirmSame = true;
                        }
                    }
                    if (confirmSame != true) {
                        lotto[i] = numCheck;
                        checkLotto = true;                                               
                    }
                }
            } 

番号を生成し、int numCheck = (rand.nextInt(MAX) + 1)これまでに入力されたすべての宝くじ番号に対してその番号をチェックします。

for (int j = 0; j <= i; j++) {
    if (numCheck == lotto[j]) {
        confirmSame = true;
    }
}

numCheck入力された数値と等しくない場合はnumCheck、現在のアレイ スポットに書き込まれます。

于 2013-02-14T18:00:19.577 に答える