簡體   English   中英

如何隨機化多行中的兩個字符?

[英]How to randomize two characters in multiple Lines?

我需要 1-4 個“X”的隨機數,而其余 6-9 個字符都將是“O”。 整個輸出需要在控制台中打印成 10 行。

到目前為止,我可以生成 6 個“O”和 1-4 個“X”中的隨機數。 但是,我不知道如何使 X 隨機分布在 O 中並且 O 將填充缺失的 X。

換句話說:如果代碼只生成 2 個“X”,我需要有 8 個“O”才能生成 10 個字符。 現在我還必須將它打印成 10 行。 我碰巧對 java 很陌生,所以到目前為止我只有以下代碼。

import java.util.Random;
  
class GFG { 
    public static void main(String[] args) 
    { 
        test();
    }

    public static void test() {
        Random r = new Random();
        int i = r.nextInt(4)+1;


        for (int k=5; k<=5; k++) {
            for (int m=0; m<=k; m++) {
                System.out.println("O");
            }
            for (int j=0; j<=i; j++) {
                System.out.println("X");
            }
        }
    }
} 

此方法會生成您想要的一行:

public static String randomLine() {
    ArrayList<Character> characters= new ArrayList<>();

    Random random=new Random();
    int k=random.nextInt(4) + 1;
    for (int i = 1; i <= k; i++) {
        characters.add('X');
        
    }
    while(characters.size()<10) {
        characters.add('O');
    }
    Collections.shuffle(characters); //  Shuffling !!!
    String str="";
    
    for(int i=0;i<10;i++)
        str=str+characters.get(i);
    return str;
    
}

如果需要,您可以將返回類型更改為ArrayList<Character>
現在,要獲得 10 行這樣的行,您可以運行以下代碼:

for(int i=0;i<10;i++)
    System.out.println(randomLine());

在創建包含隨機數 X 的數組/列表后,您可以使用現有的Arrays.shuffle / Collections.shuffle來隨機化數據的數組/集合:

public static List<String> getRandomXOs() {
    Random random = new Random();
        
    int countX = 1 + random.nextInt(4);
    List<String> xos = IntStream.range(0, 10)
                                .mapToObj(i -> i < countX ? "X" : "O")
                                .collect(Collectors.toList());
    Collections.shuffle(xos);

    return xos;
}

// -------
// test
for (int i = 0; i < 5; i++) {
    System.out.println(getRandomXOs());
}

輸出(隨機):

[O, O, O, O, X, X, X, O, O, X]
[X, O, O, O, O, X, X, O, X, O]
[O, O, O, O, O, X, O, O, O, X]
[X, O, O, O, O, O, O, O, O, O]
[O, X, X, O, O, O, O, X, O, O]

使用Java8 Stream庫,您可以用更少的代碼行更有效地解決您的問題。

這個test()函數有輸入x ,它控制將要打印的X數量,范圍從1x ,而n則控制將根據您的要求在單獨的行中打印多少XO。

import java.util.Random;
import java.util.stream.*;

class CFG {
    public static void main(String[] args) {
        test(4, 10);
    }

    public static void test(int x, int n) {
        Random random = new Random();
        int countX = 1 + random.nextInt(x);
        
        String str = random
                .ints(1, n + 1)
                .distinct()
                .limit(n)
                .mapToObj(i -> i <= countX ? "X" : "O")
                .collect(Collectors.joining("\n"));

        System.out.println(str);
    }
}

隨機輸出:

X
O
O
X
O
O
O
O
X
O

這是一個更接近您的可選代碼

代碼:

import java.util.Random;
  
class main { 
    public static void main(String[] args) 
    { 
        test();
    }

    public static void test() {
        Random r = new Random();
        int i = r.nextInt(4)+1;

        int countX=0;
        for (int j=0; j<10; j++){
            int p=r.nextInt(2);
            if (p==1) {
                System.out.println("O");
            }           
            else{
              if(countX<i){
              System.out.println("X");
              countX+=1;
              }
              else{
                  System.out.println("O");
              }
            }
            
        }
    }
} 

隨機輸出:

X
X
X
O
X
O
O
O
O
O

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM