Как вызвать алгоритм с различными размерами массива - PullRequest
0 голосов
/ 10 мая 2018

Я борюсь с созданием метода, в котором я могу создавать случайные массивы различных размеров.

Мне это нужно, потому что я должен протестировать некоторые алгоритмы со случайными массивами, и нам нужно сообщить о том, как они работают на разных входных размерах.

Чтобы иметь разные размеры, я мог создать массив всех размеров входных данных, которые я хотел, и пройти через него, присвоив значения n ниже, но, похоже, он не работает.

Приведенный ниже код компилируется, но я не получаю разные размеры ввода. Однако я получаю случайный массив.

У меня есть алгоритмы, о которых идет речь, в другом классе, и все они работают нормально, поэтому я не буду включать это здесь - только эта часть сбивает меня с толку.

У кого-нибудь есть идеи?

public class Array {
    static int[] randomArray(int n){
        int [] inputSize = {50, 100, 500, 1000, 5000, 10000, 50000, 100000, 500000};

        for (int i=0; i<inputSize.length; i++){
            n = inputSize[i];
        }
        int[] array = new int[n];

        for (int j = 0; j < n; j++){
            array [j] = (int) (Math.random() * 100); 
        }

        return array;
    }  
}

Ответы [ 4 ]

0 голосов
/ 10 мая 2018

Чтобы получить рандомизированный массив, вам нужно рандомизировать n .Смотрите:

static int[] randomArray(){
      //sizes
      int [] inputSize = {50, 100, 500, 1000, 5000, 10000, 50000, 100000, 500000};
      //randomized size
      int n = inputSize[(int) (Math.random() * inputSize.length)];
      //array with randomized size
      int[] array = new int[n];
      //filling array with randomized array
      for (int j = 0; j < n; j++){
        array [j] = (int) (Math.random() * 100); 
      }
      //randomized array (values + size)
      return array;
}

Результат:

[59, 82, 40, 2, 34, 15, 96, 98, 73, 71, 93, 83, 37, 88, 87, 11, 44, 81, 61, 33, 99, 71, 24, 41, 50, 77, 4, 39, 34, 12, 33, 94, 92, 50, 95, 76, 92, 47, 85, 56, 97, 7, 34, 50, 67, 69, 34, 47, 22, 91, 50, 68, 81, 67, 37, 90, 72, 16, 28, 37, 97, 74, 39, 32, 66, 63, 30, 90, 61, 44, 39, 11, 84, 89, 70, 79, 88, 58, 88, 48, 89, 16, 82, 7, 17, 11, 94, 4, 22, 29, 83, 65, 21, 39, 22, 35, 87, 87, 10, 4]

См. Работу в https://ideone.com/VX0CvL.

ОБНОВЛЕНИЕ В 05/12/2018: Если вынужно заказать этот результат:

static int[][] randomArray(){
   //sizes
   int [] inputSize = {50, 100, 500, 1000, 5000, 10000, 50000, 100000, 500000};
   //result
   int[][] result = new int[inputSize.length][];
   //randomized size
   for (int i=0; i<inputSize.length; i++){
        //define length
        int n = inputSize[i];
        //create array
        int[] array = new int[n];
        //filling array with randomized array
        for (int j = 0; j < n; j++){
            array[j] = (int) (Math.random() * 100); 
        }
        result[i] = array;
    }
    //randomized array (values + size)
    return result;
}

Результат:

[88, 9, ...] # n = 50
[25, 37, 24, 35, 52, ...] # n = 100
[2, 34, 7, 17, 82, 42, 20, 57, 69, 24, ...] #n = 500
...

См. работу в https://ideone.com/BCM69F

0 голосов
/ 10 мая 2018

Ваша проблема в этом цикле

    for (int i=0; i<inputSize.length; i++){
        n = inputSize[i];
    }

n всегда будет равно 500000;

Вы можете заменить этот цикл на Random.

Random random = new Random();
n = inputSize[random.nextInt(inputSize.length)];

Таким образом, этот код назначит n случайное значение из вашего inputSize массива

0 голосов
/ 10 мая 2018

В конце вашего цикла:

for (int i=0; i<inputSize.length; i++){
    n = inputSize[i];
}

n будет иметь значение 500000

Решение состоит в том, чтобы поместить весь последующий код в этот цикл.

Редактировать:
Однако ваш метод все равно будет возвращать только один массив.Возможно, расстались

public class Array {
    private static int [] inputSize = {50, 100, 500, 1000, 5000, 10000, 50000, 100000, 500000};

    public static void main(String[] args) {
        for(int i=0; i<inputSize.length; i++){
            int size = inputSize[i];
            int[] randomArray = createRandomArray(size);
            //perform your tests on randomArray
        }
    }
    /**
     * Creates a new int[] of length 'size', filled with random ints between 0-100
     **/
    private static int[] createRandomArray(int size){

        int[] array = new int[size];

        for (int j = 0; j < size; j++){
            array [j] = (int) (Math.random() * 100); 
            //or replace with a call to Random.nextInt(100) as suggested by others, for tidiness and to avoid the cast
        }


        return array;
    }  
}
0 голосов
/ 10 мая 2018

Вы можете добиться этого динамически инициализирующего размера массива.То, что вы делаете, это инициализация с фиксированной длиной и предопределенными элементами.

Следующий код создает массивы случайного размера в диапазоне 0-10, где каждый элемент находится в диапазоне 0-100:

public class Main {

    private static Random random = new Random();
    private static int maxSize = 10;
    private static int maxNum = 100;

    public static void main(String[] args) {
        System.out.println(Arrays.toString(arrays()));
        System.out.println(Arrays.toString(arrays()));
        System.out.println(Arrays.toString(arrays()));
    }

    public static int[] arrays() {
        int r = random.nextInt(maxSize);

        int[] array = new int[r];

        for (int i  = 0; i < array.length; i++)
            array[i] = random.nextInt(maxNum);

        return array;
    }
}

Вывод:

[41, 83, 41, 45, 89, 47, 61, 65, 2]
[45, 0, 11, 3, 26, 18, 8, 20]
[29, 13]
...