88138


現在、乱数を3つ生成し、スロットのようなものを作っています。  
しかし、3つの乱数がどれも同じ数字になってしまいます。

以下のコードを実行すると、すべて結果が"2,2,2"や"3,3,3"のようになってしまします。  
誰かお力添えいただけると幸いです。

**現状のコード:**

[code]

    import java.util.Random;
    public class Main{
        public static void main (String[] args){
            Random random = new Random();
            
            int[] nums = {1,2,3,4,5};
            int num = nums[random.nextInt(5)];
            
            for(int i = 0; i<3; i++){
                System.out.println(num);
            }
            
        }
    }
    
[/code]


CC BY-SA 4.0
2022-04-01T11:49:35.277
88133
2022-04-01T17:59:45.693
2022-04-01T16:19:24.797
3060
51596
question
java
乱数で複数の値を取得したいが、すべて同じ値になってしまう


変数 `num` は、

[code]

    int num = nums[random.nextInt(5)];
    
[/code]

ここで一度だけ値が更新されており、以降 `num` で参照しても同じ値が読みだされるだけです。

したがって

[code]

    for(int i = 0; i<3; i++){
        System.out.println(num);
    }
    
[/code]

ここでは同じ値が必ず出力されます。`num` と打つたびに `nums[random.nextInt(5)]` が実行されているわけでは **ありません**
。

たとえばここの `println` を `System.out.println(nums[random.nextInt(5)])`
に変えると違いが分かるでしょう。


CC BY-SA 4.0
2022-04-01T12:38:55.463
88134
2022-04-01T12:38:55.463
19110
88133
answer


それぞれの行で行っていることを日本語で説明すると次のようになります:

[code]

    Random random = new Random();
    
    // 要素数が5の配列 nums を宣言して初期値を代入
    int[] nums = { 1, 2, 3, 4, 5 };
    // num を宣言して、 配列 nums の要素(nums[0], nums[1], ..., nums[4])のうちのひとつを代入
    int num = nums[random.nextInt(5)];
    
    // 3回繰り返す
    for (int i = 0; i < 3; i++) {
        // num を出力する
        System.out.println(num);
    }
    
[/code]

要点だけ書き出すと、質問文中に書かれているコードは、次の処理を行っていることになります:

[code]

    1. num にランダムな値を代入する
    2. 以下の処理を3回繰り返す
        2-1. num の値を出力する
    
[/code]

期待している動作にするためには、

> num を宣言して、 配列 nums の要素(nums[0], nums[1], ..., nums[4])のうちのひとつを代入

の部分から3回繰り返す必要があります。  
つまり、

[code]

    1. 以下の処理を3回繰り返す
        1-1. num にランダムな値を代入する
        1-2. num の値を出力する
    
[/code]

という形にします:

[code]

    Random random = new Random();
    
    // 要素数が5の配列 nums を宣言して初期値を代入
    int[] nums = { 1, 2, 3, 4, 5 };
    
    // 3回繰り返す
    for (int i = 0; i < 3; i++) {
        // num を宣言して、 配列 nums の要素(nums[0], nums[1], ..., nums[4])のうちのひとつを代入
        int num = nums[random.nextInt(5)];
        // num を出力する
        System.out.println(num);
    }
    
[/code]


CC BY-SA 4.0
2022-04-01T17:59:45.693
88138
2022-04-01T17:59:45.693
2808
88133
answer