Не могу разобраться с System.nanoTime() [закрыт]

104
30 сентября 2019, 14:00

Есть задание:

Implement the ability to generate a pseudo-random secret number of the given length. If the given length is greater than 10, print a message and don't generate the number.

We suggest you use the following algorithm to generate the numbers.

final class SecretGenerator {
    public static void main(final String[] args) {
        long pseudoRandomNumber = System.nanoTime();
    }
}

This code saves the nanoseconds since some fixed time to the pseudoRandomNumber variable. Now we can assume that this is a random number. So you can generate a secret number by iterating the pseudoRandomNumber in reverse order and adding unique digits in the secret number. If the pseudoRandomNumber lacks the required amount of unique digits, call System.nanoTime() again and try to generate the secret number again until you get a satisfactory number.

Перевод:

Реализовать возможность генерации псевдо-случайного секретного числа заданной длины. Если заданная длина числа больше 10, то вывести сообщение и не генерировать число.

Мы предлагаем вам использовать следующий алгоритм для генерации чисел.

final class SecretGenerator {
    public static void main(final String[] args) {
        long pseudoRandomNumber = System.nanoTime();
    }
}

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

Если pseudoRandomNumber не будет хватать необходимого количества цифр, тогда снова вызовите System.nanoTime() и сгенерируйте новое секретное число. Повторяйте так до тех пор, пока не получите необходимый результат.

Не могу понять, как это сделать, подскажите, пожалуйста. Спасибо.

Answer 1

Я расшифровал.

Нужно разбить число на десятичные знаки и перебирать их добавляя к результату. Если знак уже встречался, то пропустить. Если не набралось необходимое количество знаков, то повторить.

Вот откуда взялось ограничение на длину в 10 символов.

int seed = System.nanoTime();
boolean flags = new boolean[10];
StringBuilder sb = new StringBuilder();
int tmp = seed;
while(tmp > 0) {
   int digit = tmp % 10;
   if(!flags[digit]) {
       sb.append(digit);
       flags[digit] = true;
   }
   tmp /= 10;
}

Как-то так. нужно добавить ограничение на длину результата и повтор если символов меньше.

EDIT Версия без использования StringBuilder

int seed = System.nanoTime();
boolean flags = new boolean[10];
int result = 0;
int count = 0;
int tmp = seed;
while(tmp > 0) {
   int digit = tmp % 10;
   if(!flags[digit]) {
       result *= 10;
       result += digit;
       flags[digit] = true;
       count++;
       if(count == maxCount) {
           break;
       }
   }
   tmp /= 10;
}
READ ALSO
Как остановить SQL запрос

Как остановить SQL запрос

Я делаю запрос в базу данных "SELECT * FROM USER_FM WHERE PHONE = ? OR EMAIL = ?"База данных ORACLE

115
Может ли метод onAttach() привести к memory leak?

Может ли метод onAttach() привести к memory leak?

Всегда исползую такую практику

131
Оптимизация кода JAVA

Оптимизация кода JAVA

Есть несколько классов в каждом из maven-модулейВсе классы делают одно и то же, - хранят два списка -- список команд и список их опций

147