Рубрики
Без рубрики

Как генерировать уникальные числа с помощью алгоритма Фишера-Йейтса с Java

В этой статье мы будем писать java-программу, которая реализует метод бумаги и карандаша… Помечено алгоритмами, учебником, java.

В этой статье мы напишем java-программу, которая реализует метод бумаги и карандаша алгоритма Фишера-Йейтса для генерации n-го уникального числа.

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

Но сначала…

Что это за рыба?

Перетасовка Фишера-Йейтса – это алгоритм, названный в честь Рональда Фишера и Фрэнка Йейтса, и он используется для перетасовки последовательности. Временная сложность: O(n). Основная идея заключается в том, что представьте, что у вас есть упорядоченные числа, написанные на бумаге для заметок, и вы случайным образом вычеркиваете число и записываете его на другом листе бумаги. Вы делаете это до тех пор, пока не останется ни одного неотмеченного номера. Порядок, в котором записаны числа, – это ваша перетасованная последовательность.

Поехали! 🚀

1. Начните с объявления переменных вы будете использовать

на протяжении всей программы

int n = Integer.parseInt(args[0]) ; // amount of numbers to generate
int k; // random index of unstruckNums
ArrayList unstruckNums = 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
        ArrayList unstruckNums = 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”