niejasność w kodzie

0

Witam. Niedawno zacząłem się uczyć javy. Ostatnio natchnąłem się na ten programik losujący liczby:

import java.util.*;
public class LotteryDrawing
{
   public static void main(String[] args)
   {
      Scanner in = new Scanner(System.in);

      System.out.print("Ile liczb musisz wylosować? ");
      int k = in.nextInt();

      System.out.print("Jaka jest największa liczba? ");
      int n = in.nextInt();

      int[] numbers = new int[n];
      for (int i = 0; i < numbers.length; i++)
         numbers[i] = i + 1;

      int[] result = new int[k];
      for (int i = 0; i < result.length; i++)
      {
         int r = (int) (Math.random() * n);

         result[i] = numbers[r];

         numbers[r] = numbers[n - 1];
         n--;
      }

      Arrays.sort(result);
      for (int r : result)
         System.out.println(r);
   }
}

Nie rozumiem jednak tego elementu

numbers[r] = numbers[n - 1];
n--;

Wiem, że ten fragment zapobiega powtarzaniu się liczb, ale chciałbym żeby ktoś mi wytłumaczył na chłopski rozum jak to działa.

1

Jak wylosujesz jedną liczbę to usuwasz tę liczbę z puli możliwych. Czyli jeśli masz
numbers[] = [1][2][3][4][5], n = 5
wylosujesz powiedzmy r = 2 to wywalasz numbers[2] (liczbę 3 bo indeksy idą od 0) z puli nadpisując ją ostatnią liczbę. Po tym masz
numbers[] = [1][2][5][4][5], n = 4
czyli Twoja pula to teraz [1][2][5][4]

1

result przechowuje wylosowane liczby a numbers liczby z których losujesz. Losujesz poprzez wybranie sobie pewnego indeksu z tablicy numbers. Wybierasz indeks r, zapisujesz sobie w wynikach liczbę pod tym indeksem numbers[r] a następnie w miejsce "zużytej" liczby wpisujesz ostatnią wolną liczbę z tablicy numbers i "skracasz" tą tablicę.

Wyobraź sobie że "zamieniasz" miejscami liczbę wylosowana oraz ostatnią liczbę z tablicy a potem odcinasz tą ostatnią liczbę.

0

ok, dziękuje

1 użytkowników online, w tym zalogowanych: 0, gości: 1