Как генерировать случайные числа с неповторяющимися цифрами в Java?

При использовании случайной утилиты в Java вы получаете несколько чисел, таких как: 1271, 34556, 177 и т. Д. Какой самый простой способ сделать это, чтобы цифры не повторялись?

6 ответов

Решение

Как насчет создания цикла, который проверяет, соответствует ли сгенерированное случайное число вашим требованиям.

final Random rnd = new Random();
int n;
do {
    n = rnd.nextInt(1000);
} while(containsRepeatingDigits(n));

containsRepeatingDigits может выглядеть так:

boolean containsRepeatingDigits(final int n) {
    final boolean digits[] = new boolean[10];
    for(char c : String.valueOf(n).toCharArray()) {
        final int i = c-'0';
        if(digits[i])
            return true;
        digits[i] = true;
    }
    return false;
}

Вы можете перемешать массив [1,2,3,4,5,6,7,8,9] и прочитать его как число.

Если вы не хотите фиксировать количество цифр или разрешать не ведущий ноль, это усложняется (если вы заботитесь о каком-то равном распределении).

Вы могли бы инициализировать List с цифрами 0-9, Затем рандомизируйте этот список и опросите случайное количество элементов (от 1 до 9) из этого списка. Объедините цифры, и вы получите свой номер с неповторяющимися цифрами.

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

    private static Random rand = new Random();
    public static int GenerateNumberNonRepeat()
    {
        int number;
        do
        {
            number = rand.Next();
        } while (IsRepeating(number));

        return number;
    }

    public static bool IsRepeating(int number)
    {
        string textual = number.ToString();
        for (int i = 0; i < textual.Length; i++)
        {
            for (int j = i + 1; j < textual.Length; j++)
            {
                if (textual[i] == textual[j])
                    return true;
            }
        }

        return false;
    }

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

В отличие от предложенного подхода случайного выбора / выбора, это имеет то преимущество, что вы сохраняете (более или менее) распределение исходного rng.

Этот код может помочь вам

    Set set  = new HashSet<Integer>();
    Random rand= new Random();
    public int getNonRepeatingRandomNumber() {
        int intV = rand.nextInt();
        if(set.contains(intV)) {
            return getNonRepeatingRandomNumber();
        }
        else {
            set.add(intV);
            return intV;
        }
    }
Другие вопросы по тегам