Диапазон значений для случайного заполнения в цикле - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь написать метод, который будет генерировать случайные целые числа в отсортированном порядке, и предел случайных чисел должен быть логарифмом того, сколько их введено.Код, который я написал, работает, когда я делаю 10 целых чисел, я получаю 0 для всех выходных данных, что является правильным.Однако, если я введу 100 или 1000, я не получу значения 0,1 или 0,1, и 2. Я не знаю, почему это не правильно вычисляется, мне просто нужно, чтобы только инициализировать целые числав массиве должен быть журнал числа, но он не работает для чего-то большего, чем 10. Любая помощь будет принята с благодарностью, я разместил код ниже.

public static void randomSortedLimited(ArrayList<Integer> inL,
                                                    int inHowMany) {

    inL.clear();
    int limit = (int) (Math.log10(inHowMany));
    //System.out.println(limit); added to make sure limit is calculated properly
    inL.add(0);
    for (int i = 1; i < inHowMany - 1; i++) {
        inL.add(i, inL.get(i-1) + new java.util.Random().nextInt(limit));
     }
}

Ввод: randomSortedLimited(emptyList, 10);

Выход: [0,0,0,0,0,0,0,0,0,0]

Вход: randomSortedLimited(empytList, 100);

Выход:

[0, 1, 2, 2, 3, 3, 4, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 11, 11, 11, 12, 12, 12, 13, 13, 14, 15, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20, 21, 22, 22, 23, 23, 24, 24, 25, 26, 27, 28, 29, 30, 30, 30, 31, 31, 32, 32, 32, 32, 32, 33, 33, 34, 35, 35, 36, 37, 38, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 50]
BUILD SUCCESSFUL (total time: 0 seconds)

Ответы [ 3 ]

1 голос
/ 25 сентября 2019

Поскольку вы не хотите, чтобы числа увеличивались, не выполняйте часть inL.get(i-1) +.

Чтобы получить лучшую случайность, не создавайте новый объект Random внутри цикла.

Чтобы получить случайно сгенерированные номера в отсортированном порядке, позвоните sort() перед возвратом.

Это означает, что ваш код должен быть:

public static void randomSortedLimited(ArrayList<Integer> inL, int inHowMany) {
    int limit = (int) (Math.log10(inHowMany));
    Random random = new Random();
    inL.clear();
    for (int i = 0; i < inHowMany; i++) {
        inL.add(random.nextInt(limit));
    }
    Collections.sort(inL);
}

ОБНОВЛЕНИЕ: От комментарий :

Я не могу использовать Collections.sort, потому что это слишком дорого для вызова.

Вместодобавьте случайные числа в список по мере их создания, подсчитайте их и добавьте потом.Поскольку существует только limit различных целых числа, вы можете использовать массив счетчиков:

public static void randomSortedLimited(ArrayList<Integer> inL, int inHowMany) {
    int limit = (int) (Math.log10(inHowMany));

    // Generate and count random numbers
    Random random = new Random();
    int[] count = new int[limit];
    for (int i = 0; i < inHowMany; i++) {
        count[random.nextInt(limit)]++;
    }

    // Build list of random numbers in ascending order
    inL.clear();
    for (int i = 0; i < limit; i++) {
        Integer number = i; // autobox once
        for (int j = 0; j < count[i]; j++) {
            inL.add(number);
        }
    }
}

Пример вывода с inHowMany = 1000, для обоих решений выше

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]

0 голосов
/ 25 сентября 2019

Это должно работать:

    public static void randomSortedLimited(int inHowMany) {

        ArrayList<Integer> inL = new ArrayList<Integer();
        int limit = (int) (Math.log10(inHowMany));
        //System.out.println(limit); added to make sure limit is calculated properly
        inL.add(0);
        for (int i = 1; i < inHowMany - 1; i++) {
            inL.add(i, (int)(Math.random() * (limit - inL.get(i - 1)) + inL.get(i - 1));
        }
    }
0 голосов
/ 25 сентября 2019

Проверьте, что Math.log (ваше выражение и приведение типа) возвращает при применении к 10 и 100 соответственно ... И nextInt возвращает от 0 до на единицу меньше , чем его аргумент (что такое выражение журнала).

...