0

I have an array a[5][5] and several values. I want to randomly assign values based on random percentages I create. For example one value is 6 and 25% of the elements in the array should have the value 6. With what I have so far: I created the random percentages and I'm able to randomly assign values for different elements in the array. My problem is: more than 25% of the elements have 6. My question is: How do I make sure that when assigning elements with 6, exactly 25% of the elements in the array a[5][5] have that value? I'm new to programming and tried several loops and ifs but nothing is working out for me. Please push me towards the right direction.

3
  • 3
    Please post the code you have so that we can help improving upon it Commented Nov 2, 2014 at 3:01
  • 1
    how exactly did you create the random percentages and how are you able to randomly assign values for different elements in the array? Help us help you. Commented Nov 2, 2014 at 5:21
  • With a 5x5 array there are 25 elements, you will never be able to get exactly 25% of them to be anything because 25% is 1/4 and 25 elements is not divisible by 4. Commented Nov 2, 2014 at 17:55

2 Answers 2

1

25% of 25 is about 6. It is not accurate. Here is a possible solution.

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");
     }
}
}
Sign up to request clarification or add additional context in comments.

Comments

0

I would do it like this

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

}

I have commented the code to explain what everything does. However it does not protect against bad user input and it hardcodes the size of the array, you should always try to avoid hardcoding. In this example I did it (and marked where) to be more clear. Also as was mentioned in the comments above, for your situation where you want exactly 25% of 25 is not possible. This is because .25 * 25 = 6.25 and you can't have .25 of an element.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.