Generator losowych liczb

0

Witam

Mam problem ze wstawianiem losowych liczb... Jak to wyglada w javie?

Zalozmy cos takiego:

public class Macierz { 
    int kolumny; 
    int wiersze; 
    int wartosc; 
    int[][] tab; 
    
    public Macierz(int kolumny, int wiersze) { 
        this.kolumny=kolumny; 
        this.wiersze=wiersze; 
    } 

    public int[][] utworz(){ 
        
        this.tab=new int[this.kolumny][this.wiersze]; 
        for(int i=0;i<this.kolumny;i++) 
            for(int j=0;j<this.wiersze;j++){ 
            this.tab[i][j]=wartosc; 
            } 
            return this.tab;            
    } 
    public void wypisz(){ 
        System.out.println("Macierz: "); 
        for(int i=0;i<this.tab.length;i++){ 
            for(int j=0;j<tab[i].length;j++){ 
                    System.out.print(tab[i][j]); 
        } 
            System.out.println(); 
    } 
    
    
}

I teraz jak uzupelnic te macierz losowymi liczbami? Czy pod zmienna wartosc wstawiac jakas losowa wartosc? Tylko jak: /? A moze jakis inny sposob...

0

O ile pamietam, to klasa Random jest w javie:

public int[][] utworz(){
  Random randomGenerator() = new Random();
  this.tab=new int[this.kolumny][this.wiersze];
  for(int i=0;i<this.kolumny;i++)
    for(int j=0;j<this.wiersze;j++)
      this.tab[i][j]=randomGenerator.nextInt();
  return this.tab;           
} 

ew. zastanow sie nad wersja konstruktora Random(int seed).

0

Dziekuje, miales racje: )

Coprawda zadzialalo przy takiej konstrukcji:

public int[][] utworz(){
        this.tab=new int[this.kolumny][this.wiersze];
        Random generator = new Random();
        for(int i=0;i<this.kolumny;i++)
            for(int j=0;j<this.wiersze;j++){
            this.tab[i][j]=generator.nextInt(10);
            }
            return this.tab;            
    }

ale trop byl dobry; )

Przy okazji znalazlem jeszcze jeden sposob:

public int[][] utworz(){
        this.tab=new int[this.kolumny][this.wiersze];
        for(int i=0;i<this.kolumny;i++)
            for(int j=0;j<this.wiersze;j++){
            this.tab[i][j]=(int)(Math.random()*10);
            }
            return this.tab;            
    }

tez dziala, moze sie komus w przyszlosci przyda; )

Tak na marginesie moze ktos wie czym sie roznia te dwa sposoby losowan?

0

Math.random() to posrednie wykonanie:

Random randomGenerator = new Random();
randomGenerator.nextDouble();

tak pisze dokumentacja. Te dwa sposoby roznia sie zatem tylko zakresem i typem zwracanych liczb (bo nextInt() i nextDouble()) ;)

0

Chcialem zrobic porownywanie, zeby dodawac(samo dodawanie jest ok) tylko macierze, ktorych wymiary sa rowne...

public void dodaj(Macierz A, Macierz B){
    boolean czy=A.equals(B);
    
    if(czy){
        ...
    }
    else{
        System.out.println("Macierze roznych wymiarow");
    }
    }

... i niezaleznie czy jest if(czy) czy if(!czy) zawsze wywala "Macierze roznych wymiarow": / Trzeba napisac osobna metode do sprawdzania czy mozna to jakos poprawic: /?

0

Musisz przeladowac metode equals dla klasy Macierz, tak by sprawdzala wymiary. Jesli tego nie zrobiles to domyslna wersja sprawdza czy referencje odnosza sie do tego samego obiektu w pamieci, a w Twoim wypadku zazwyczaj tak nie bedzie (chyba, ze w parametrach wywolania dasz ten sam obiekt dwa razy).

0
Random rand=new Random(System.currentTimeInMilis())
int x= (int)(rand.nextDouble()*ZAKRES) //ZAKRES = max int

w ten sposob masz pelna kontrole

natomiat zgodnie z tym co powiedzial przedmowca Eqals musisz przeciazyc oraz getHashCode() (tak to chyba jakos lecialo) przy zalozeniu, ze jesli dla dwoch obiektow Equals zwraca true to HashCode jest taki sam

pozdr

0

Dziekuje za odpowiedzi. Uproscilem wszystko maksymalnie na razie-podaje tylko jeden parametr przy tworzeniu macierzy i operuje na kwadratowej.

A teraz, jeszcze takie pytanie-jak zaimplementowc, zeby metoda pobierala jako parametr dowolny obiekt klasy: / Bo ciagle pisze, np. public void pomnoz(Macierz A, Macierz B){...}
i pozniej tworze Macierz A=new Macierz(3);
Macierz B=new Macierz(3);
Macierz tmp=new Macierz(3);

i wywoluje
`tmp.pomnoz(A,B);`
chcialem dopisac do konstruktora pole char nazwa, tak zeby chrakteryzowac macierz po nazwie i tworzyc np. Macierz A=new Macierz(3,'A'); ale jak wtedy pobrac macierz do metody poprzez te nazwe: /? public void pomnoz(???, ???){...} : /
0

Nie zrozumialem tego co chcesz zrobic. Ale sposob w jaki to robisz jest kiepski. Duzo bardziej intuicyjnie zrobic tak:

public void pomnoz(Macierz druga){}

Macierz A = new Macierz(3);
Macierz B = new Macierz(3);
Macierz C = A.pomnoz(B);

A z ta nazwa nie zalapalem.

0

Tak myslalem, ze zamotam i ciezko bedzie to zrozumiec:D A to co napisales rzeczywiscie ma sens tylko podczas kompilacji blad:
...\Test.java\src\test\Main.java incompatible types
found : void
required: test.Macierz
Macierz C = A.pomnoz(B);

0

Ok, juz sobie poradzilem... Jeszcze nie jest do konca tak jakbym chcial, ale to na razie mniej wazne. A teraz jeszcze sprawa, ktora ciezko bedzie mi samemu wymyslic, wiec jesli ktos moze poratowac podpowiedzia i/lub kawalkiem kodu dotyczacego jak policzyc macierz odwrotna i/lub rzad macierzy to bylbym wdzieczny naturalnie. Do odwrotnej potrzebny jest wyznacznik, ktory napisalem-na razie tylko dla macierzy 2x2 i 3x3, ale na razie wystarczy;)

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