В этой статье мы напишем java-программу, которая реализует метод бумаги и карандаша алгоритма Фишера-Йейтса для генерации n-го уникального числа.
Вы также можете использовать любой список чисел (или что-нибудь еще, что не имеет значения), чтобы перетасовать их последовательность.
Но сначала…
Что это за рыба?
Перетасовка Фишера-Йейтса – это алгоритм, названный в честь Рональда Фишера и Фрэнка Йейтса, и он используется для перетасовки последовательности. Временная сложность: O(n). Основная идея заключается в том, что представьте, что у вас есть упорядоченные числа, написанные на бумаге для заметок, и вы случайным образом вычеркиваете число и записываете его на другом листе бумаги. Вы делаете это до тех пор, пока не останется ни одного неотмеченного номера. Порядок, в котором записаны числа, – это ваша перетасованная последовательность.
Поехали! 🚀
1. Начните с объявления переменных вы будете использовать
на протяжении всей программы
int n = Integer.parseInt(args[0]) ; // amount of numbers to generate int k; // random index of unstruckNums ArrayListunstruckNums = new ArrayList (); ArrayList results = new ArrayList ();
2. Заполните список неструктурированных номеров цифрами
от 0 до n (исключительный)
for (int i = 0; i < n; i++) { unstruckNums.add(i); }
Теперь, что мы хотим сделать, это вычеркнуть случайные числа из списка unstruckNums
и добавить их в отдельный список, который является результатами
. Для достижения этой цели мы
3. сгенерируйте случайный индекс k
который находится между 0 и количеством неструктурированных чисел
оставшийся
for (int i = 0; i < n; i++) { // k represents the index of the number we want to strike out from the unstruckNums k = (int) Math.floor(Math.random() * (unstruckNums.size())); }
4. Добавьте число с индексом k в наш список результатов
и вычеркните его из списка unstruckNums
.
for (int i = 0; i < n; i++) { k = (int) Math.floor(Math.random() * (unstruckNums.size())); results.add(unstruckNums.get(k)); unstruckNums.remove(unstruckNums.get(k)); }
Вот и все, с тобой покончено. Распечатайте результаты
System.out.println(results);
Распечатайте результаты В качестве примера:
@tebza> javac UniqueNums.java @tebza> java UniqueNums.java 12 [6, 1, 0, 5, 4, 10, 2, 11, 3, 8, 9, 7]
Распечатайте результаты в качестве примера: Вот полный код:
import java.util.ArrayList; public class UniqueNums{ public static void main(String[] args) { int n = Integer.parseInt(args[0]) ; // amount of numbers to generate int k; // random index of unstruckNums ArrayListunstruckNums = new ArrayList (); ArrayList results = new ArrayList (); // Fill the UnstruckNums list with numbers from 0 to n for (int i = 0; i < n; i++) { unstruckNums.add(i); } for (int i = 0; i < n; i++) { // k represents the index of the number we want to strike out from the unstruckNums k = (int) Math.floor(Math.random() * (unstruckNums.size())); results.add(unstruckNums.get(k)); unstruckNums.remove(unstruckNums.get(k)); } System.out.println(results); } }
Распечатайте результаты в качестве примера: Вот полный код: Заключение
Распечатайте результаты Пример: Вот полный код: Заключение Перетасовка фишера-Йейтса – это простой алгоритм, используемый для перетасовки последовательности списков. Распечатайте результаты Пример: Вот полный код: Заключение Перетасовка фишера-Йейтса – это простой алгоритм, используемый для перетасовки последовательности списков. Мы использовали его для перетасовки упорядоченного списка чисел, для создания списка уникальных номеров.
Оригинал: “https://dev.to/tebogonomnqa/generating-unique-numbers-with-java-using-fisher-yates-algorithm-eg5”