• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java - Random nie losuje liczb

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
374 wizyt
pytanie zadane 21 maja 2021 w Java przez Fishu Nowicjusz (150 p.)

Z jakiegoś powodu Random nie losuje mi liczb. Kiedy wypisuję elementy do konsoli pokazuje wszędzie null gdzie powinny być wylosowane elementy. Już robiłem praktycznie identyczny program i wszystko działało jak powinno (sprawdzałem z tamtym kodem i mam wszystko tak samo). Oto kod:

Main:

import java.util.Random;
import java.lang.Math;

public class Main
{
    static void clear()
    {
        for(int i=0; i<50; i++)
        {
            System.out.println();
        }
    }

    public static void main(String[] args)
    {
        int losSamolotu=0;
        int losLotniska1=0;
        int losLotniska2=0;
        double odleglosc=0;

        Samoloty[] samolot = new Samoloty[100];
        samolot[1] = new Samoloty("Daher TBM-930", 2430, 150);

        Lotniska[] lotnisko = new Lotniska[100];
        lotnisko[1] = new Lotniska("EPKT", "Katowice - Pyrzowice", 50.48, 19.08, 10495);
        lotnisko[2] = new Lotniska("EPKK", "Krakow - Balice",      50.08, 19.78, 8359);

        Random r=new Random();
        losSamolotu=r.nextInt(1)+1;
        do
        {
            losLotniska1=r.nextInt(2)+1;
            losLotniska2=r.nextInt(2)+1;
            odleglosc=Math.acos(Math.sin(Math.toRadians(lotnisko[losLotniska1].X))*Math.sin(Math.toRadians(lotnisko[losLotniska2].X))+Math.cos(Math.toRadians(lotnisko[losLotniska1].X))*Math.cos(Math.toRadians(lotnisko[losLotniska2].Y-lotnisko[losLotniska1].Y)))*6371*0.621;
        }
        while(losLotniska1==losLotniska2 || odleglosc>samolot[losSamolotu].zasieg);

        System.out.println(samolot[losSamolotu].nazwa);
        System.out.println(lotnisko[losLotniska1].ICAO + " - " + lotnisko[losLotniska1].nazwa);
        System.out.println(lotnisko[losLotniska2].ICAO + " - " + lotnisko[losLotniska2].nazwa);
        System.out.println(odleglosc + "NM");

    }
}

Samoloty:

public class Samoloty
{
    String nazwa;
    int rozbieg;
    int zasieg;

    Samoloty(String sNazwa, int sRozbieg, int sZasieg)
    {
        sNazwa=nazwa;
        sRozbieg=rozbieg;
        sZasieg=zasieg;
    }
}

Lotniska:

public class Lotniska
{
    String ICAO;
    String nazwa;
    double X;
    double Y;
    int dlPasa;

    Lotniska(String lICAO, String lNazwa, double lX, double lY, int lDlPasa)
    {
        lICAO=ICAO;
        lNazwa=nazwa;
        lX=X;
        lY=Y;
        lDlPasa=dlPasa;
    }
}

Używam IntelliJ IDEA a w starym programie używałem Eclipse o ile to ma jakieś znaczenie.

2
komentarz 21 maja 2021 przez Oscar Nałogowiec (29,340 p.)
W konstruktorach klas Lotniska i Samoloty masz przypisania wartości w niewłaściwą stronę, czyli praktycznie nie inicjalizujesz pól.

Trochę poza tematem:

Pozycje geograficzną podaję się jako długość i szerokość geograficzną (longitude, latitude) a nie X i Y. Tak wszyscy są przyzwyczajeni - X,Y będzie mylące.

W w symulatorze lotu FGFS (open source) jest plik zawierający dane, w tym współrzędne, chyba wszystkich lotnisk na świecie.
1
komentarz 21 maja 2021 przez Fishu Nowicjusz (150 p.)
Wszystko działa, wielkie dzięki za pomoc.

Pozdrawiam :)

1 odpowiedź

0 głosów
odpowiedź 21 maja 2021 przez Wiciorny Ekspert (278,610 p.)

Konstruktor. Pomijam fakt, że jest pakietowy- a jak już używasz klasy publicznej to przemyśl czy jest sens go określać z dostępem pakietowym 

   Lotniska(String lICAO, String lNazwa, double lX, double lY, int lDlPasa)
    {
        lICAO=ICAO;
        lNazwa=nazwa;
        lX=X;
        lY=Y;
        lDlPasa=dlPasa;
    } 
zamień na 
   Lotniska(String lICAO, String lNazwa, double lX, double lY, int lDlPasa)
    {
      this.ICAO= lICAO=ICAO;
      this.nazwa= lNazwa;
       this.X=IX;
       this.Y=IY;
       this.dlPasa=lDlPasa;
    }

Brak modyfikatora - oznacza, dostęp default- poczytaj.
Dodatkowo poczytaj, czym jest "this" dla czytelności warto wskazać czego tyczą się pola :) - że są to pola obiektu nie np. statyczne szablonu klasy 

1
komentarz 21 maja 2021 przez Fishu Nowicjusz (150 p.)
Dziękuję za rady, poczytam o tym

Pozdrawiam :)

Podobne pytania

0 głosów
1 odpowiedź 846 wizyt
+1 głos
1 odpowiedź 429 wizyt
pytanie zadane 4 lutego 2021 w C i C++ przez NukaNuka56 Obywatel (1,080 p.)
+1 głos
2 odpowiedzi 1,516 wizyt

93,164 zapytań

142,175 odpowiedzi

321,925 komentarzy

62,491 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 453p. - Marcin Putra
  2. 453p. - dia-Chann
  3. 447p. - Łukasz Piwowar
  4. 443p. - CC PL
  5. 431p. - Łukasz Eckert
  6. 428p. - rafalszastok
  7. 423p. - Michal Drewniak
  8. 423p. - Adrian Wieprzkowicz
  9. 418p. - rucin93
  10. 415p. - Mikbac
  11. 410p. - Piotr Aleksandrowicz
  12. 408p. - ksalekk
  13. 402p. - Mariusz Fornal
  14. 401p. - Dawid128
  15. 392p. - ikarek-one
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...