Java 2D数组随机分配

Java 2D数组随机分配,java,arrays,random,Java,Arrays,Random,我有一个数组a[5][5]和几个值。我想根据我创建的随机百分比随机分配值。例如,一个值为6,数组中25%的元素的值应为6。利用我目前所拥有的:我创建了随机百分比,并且能够为数组中的不同元素随机赋值。我的问题是:超过25%的元素有6个。我的问题是:如何确保在为元素分配6时,数组a[5][5]中正好有25%的元素具有该值?我是编程新手,尝试了几个循环和ifs,但都不管用。请把我推向正确的方向 我会这样做 import java.util.Random; import java.util.Scanne

我有一个数组a[5][5]和几个值。我想根据我创建的随机百分比随机分配值。例如,一个值为6,数组中25%的元素的值应为6。利用我目前所拥有的:我创建了随机百分比,并且能够为数组中的不同元素随机赋值。我的问题是:超过25%的元素有6个。我的问题是:如何确保在为元素分配6时,数组a[5][5]中正好有25%的元素具有该值?我是编程新手,尝试了几个循环和ifs,但都不管用。请把我推向正确的方向

我会这样做

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);
    }

}
import java.util.Random;
导入java.util.Scanner;
类随机数组{
/**
*@param args
*/
公共静态void main(字符串[]args){
//创建数组;您指定了5x5,但可能不应该像这样硬编码
int[][]数字=新int[5][5];
//创建扫描仪以获取用户输入
扫描仪=新的扫描仪(System.in);
//我没有做任何事情来确保他们给出一个小数点,这样程序就不能运行了
//如果你没有给出小数点,那就对了
System.out.println(“您要填写多少?输入一个小数点”);
//打替补
double populatePercentage=scanner.nextDouble();
System.out.println(“您要填写什么号码?”);
//得到一个整数
int fillNumber=scanner.nextInt();
//不要像这样硬编码
int fillTimes=填充次数(25,填充百分比);
//这是在循环之外声明的,因为否则它将是
//每次循环运行时重置
整数计数=0;
//创建一个随机数生成器;默认种子是当前时间,这足以满足此要求
Random rand=新的Random();
//用数字填充数组
对于(int i=0;i<5;i++){
对于(int j=0;j<5;j++){
//检查您是否填写了足够的次数
如果(计数<填充次数){
编号[i][j]=填充编号;
//将计数增加1;这就是跟踪的方式
计数++;
}否则{
//否则,选择一个随机数生成器
//这将选择一个0-50(含0-50)之间的随机整数
int random number=rand.nextInt(51);
//这将确保您不会生成相同的随机数
//与您正在填充的数字相同;这表示如果相同,则生成一个新数字
while(randomNumber==fillNumber){
randomNumber=rand.nextInt(51);
}
//一旦我们知道它的随机性,就会填充阵列中的点
数字[i][j]=随机数;
}
}
}
//打印出阵列
打印阵列(数字);
}
专用静态void打印数组(int[][]个数字){
//只需循环并打印每个数字
对于(int i=0;i<5;i++){
对于(int j=0;j<5;j++){
//带格式打印:表示打印一个数字(%d),后跟一个
//选项卡(\t),然后指定要打印的数字
System.out.printf(“%d\t”,数字[i][j]);
}
//每行后打印一行
System.out.printf(“\n”);
}
}
私有静态int numberOfTimesToFill(int元素,双填充百分比){
System.out.println((int)(populatePercentage*元素));
//强制转换为int以截断数字的小数部分,因为您不能
//元素的一小部分
返回值(int)(人口百分比*元素);
}
}

我已经对代码进行了注释,解释了所有的功能。但是,它不能防止错误的用户输入,并且它对数组的大小进行硬编码,因此应始终避免硬编码。在本例中,我这样做(并标记了位置)是为了更清楚。正如上面的评论所提到的,在你的情况下,你想要25%的25%是不可能的。这是因为.25*25=6.25,一个元素不能有.25。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;
导入java.util.Scanner;
公共类矩阵25{
公共静态void main(字符串[]args){
int[][]矩阵=新int[5][5];
扫描仪=新的扫描仪(System.in);
System.out.print(“输入要填充数组到25%的数字:”;
int number=scanner.nextInt();
整数百分比=25;
生成矩阵(矩阵、数字、百分比);
打印矩阵(矩阵);
}
公共静态void generateMatrix(int-Matrix[][],int-num,int-perc){
int n;
int max=矩阵。长度*矩阵[0]。长度;
int[]个数=新的int[max];
随机rnd=新随机();
int m=(int)(最大值*(perc/100.0));
int x=num>m?m-1:m;

对于(int i=0;i请发布您的代码,以便我们可以帮助改进,您究竟是如何创建随机百分比的,以及如何为数组中的不同元素随机分配值的?请帮助我们帮助您。对于5x5数组,有25个元素,您将永远无法获得25%的元素,因为25%是1/4和25元素不能被4整除。