簡體   English   中英

Java 2D數組隨機分配

[英]Java 2D array assigning randomly

我有一個數組a [5] [5]和幾個值。 我想根據我創建的隨機百分比隨機分配值。 例如,一個值是6,數組中25%的元素應具有值6。到目前為止,我已經做到了:我創建了隨機百分比,並且能夠為數組中的不同元素隨機分配值。 我的問題是:超過25%的元素具有6。我的問題是:如何確保在給元素分配6時,數組a [5] [5]中恰好25%的元素具有該值? 我是編程新手,嘗試了幾次循環和ifs,但沒有任何結果適合我。 請把我推向正確的方向。

25的25%約為6。這是不正確的。 這是一個可能的解決方案。

import java.util.Random;
import java.util.Scanner;

public class Matrix25 {
public static void main(String[] args) {
  int[][] Matrix = new int[5][5];
  Scanner scanner = new Scanner(System.in);
  System.out.print("Enter the number you want to fill the array to 25%: ");
  int number = scanner.nextInt();
  int percentage=25;
  generateMatrix(Matrix,number,percentage);
  printMatrix(Matrix);        
}

public static void generateMatrix(int Matrix[][],int num, int perc) {        
    int n;
    int max=Matrix.length*Matrix[0].length;
    int[] numbers = new int[max];
    Random rnd = new Random();
    int m = (int)(max * (perc/100.0));
    int x=num>m?m-1:m;
    for(int i=0;i<max;i++)
            numbers[i]=(i<x)?num:i+1;

    for(int i=0;i<Matrix.length;i++)
        for(int j=0;j<Matrix[i].length;j++) {
            n=rnd.nextInt(max);   
            Matrix[i][j]=numbers[n];
            numbers[n]=numbers[max-1];
            max--;
        }
}

public static void printMatrix(int Matrix[][]) {
     for(int i=0;i<Matrix.length;i++) {
        for(int j=0;j<Matrix[i].length;j++) 
                System.out.printf("%3d\t",Matrix[i][j]);
        System.out.print("\n");
     }
}
}

我會這樣

import java.util.Random;
import java.util.Scanner;

 class Random2darray {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // Create array; you specified 5x5 but you probably shouldn't hard code like this
        int[][] numbers = new int[5][5];
        //Create a scanner to get user input
        Scanner scanner = new Scanner(System.in);
        //I am not doing anything to make sure they give a decimal so the program won't work 
        //right if you are not giving a decimal
        System.out.println("How much do you want to fill? Enter a decimal.");
        //Get a double
        double populatePercentage = scanner.nextDouble();
        System.out.println("What number do you want to fill with?");
        //Get an int
        int fillNumber = scanner.nextInt();
        //Don't hardcode like this
        int fillTimes = numberOfTimesToFill(25, populatePercentage);
        //This is declared outside of the loops because otherwise it will be 
        //reset each time the loop runs
        int count = 0;
        //Create a random number generator; default seed is current time which is good enough for this
        Random rand = new Random();
        //Fill the array with numbers
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                //Check if you have filled with given number enough times
                if(count < fillTimes){
                    numbers[i][j] = fillNumber;
                    //Increment count by 1; this is how you are keeping track
                    count++;
                }else{
                    //Otherwise pick a random number generator
                    //This will pick a random int between 0 - 50 inclusive
                    int randomNumber = rand.nextInt(51);
                    //This will make sure that you are not generating random numbers that are the same
                    //as the number you are filling with; This says if it is the same generate a new number
                    while(randomNumber == fillNumber){
                        randomNumber = rand.nextInt(51);
                    }
                    //Once we know its random fill the spot in the array 
                    numbers[i][j] = randomNumber;
                }
            }
        }
        //Print the array out
        printArray(numbers);
    }

    private static void printArray(int[][] numbers) {
        //Just loop through and print every number
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                //Print with formatting: this says print a digit (%d) followed by a 
                //tab(\t) and then specifies what number I want to print
                System.out.printf("%d\t", numbers[i][j]);
            }
            //Print a new line after each row
            System.out.printf("\n");
        }
    }

    private static int numberOfTimesToFill(int elements, double populatePercentage) {
        System.out.println((int)(populatePercentage * elements));
        //Cast to an int to truncate the decimal part of the number because you can't have 
        //a fraction of an element
        return (int)(populatePercentage * elements);
    }

}

我已經注釋了代碼以解釋所有操作。 但是,它不能防止用戶輸入錯誤,並且會對數組的大小進行硬編碼,因此應始終避免硬編碼。 在此示例中,我做了(並標記在哪里)以使其更加清晰。 另外,正如上面評論中提到的那樣,對於您所需要的25%中的25%的情況,這是不可能的。 這是因為.25 * 25 = 6.25,而元素不能有.25。

暫無
暫無

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

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