funkcja Random losuje tylko zero

0

witam,

proszę o wyjaśnienie, dlaczego kod wyświetla mi tylko wartość 0, a nie liczby do 10?

public class Kwadraty extends Applet{
	Random losowanie;
	int n;
	String str = "   ";
	int losowanieKwadratow(){
		   losowanie = new Random();
		   n = losowanie.nextInt(10);
		   return n;
		   }
	public void init(){
	Kwadraty k = new Kwadraty();
	k.losowanieKwadratow();
	str += toString().valueOf(n);
	}
	public void paint(Graphics g){
		g.drawLine(12, 10, 12, 13);
		g.drawLine(1,4,67,89);
		g.drawString(str, 40, 20);
	}
}

0

Na przykład dlatego ze za każdym razem tworzysz sobie nowy obiekt Random() i od nowa inicjalizujesz generator? Czemu nie stworzysz tego obiektu w miejscu deklaracji pola w klasie?

0

Shalom, poprawiłam kod zgodnie z Twoją sugestią:

public class Kwadraty extends Applet{
	Random losowanie = new Random();
	int n;
	String str = " ";
	int losowanieKwadratow(){
		   
		   n = losowanie.nextInt(10);//zrobic z tego typ void
		   return n;
		   }
	public void init(){
	Kwadraty k = new Kwadraty();
	k.losowanieKwadratow();
	str += toString().valueOf(n);
	}
	public void paint(Graphics g){
		g.drawLine(12, 10, 12, 13);
		g.drawLine(1,4,67,89);
		g.drawString(str, 40, 20);
	}
}

i znowu to samo...

0

Każdy nowy generator zaczyna z takim ziarnem (seed). Zasada działania jest taka, że przy kolejnych użyciach wychodzą liczby o odpowiednim rozkładzie losowym. W skrócie nie rób w funkcji "new Random()"

0
import java.awt.Graphics;
import java.util.Random;

import javax.swing.JApplet;

public class Kwadraty extends JApplet {
    private static final long serialVersionUID = 1L;
    private final Random losowanie = new Random();
    private String str = new String();

    int losowanieKwadratow() {
        return losowanie.nextInt(10);
    }

    @Override
    public void init() {
        Kwadraty k = new Kwadraty();
        str += k.losowanieKwadratow();
    }

    @Override
    public void paint(Graphics g) {
        g.drawLine(12, 10, 12, 13);
        g.drawLine(1, 4, 67, 89);
        g.drawString(str, 40, 20);
    }
}

Jak to mawiają "u mnie działa"...

0

@Zjarek, fragment dokumentacji:

public Random()

Creates a new random number generator. This constructor sets the seed of the random number generator to a value very likely to be distinct from any other invocation of this constructor.

1

Przyczyna jest w czymś innym (nie w losowaniu):

        public void init(){
        Kwadraty k = new Kwadraty();
        k.losowanieKwadratow();
        str += toString().valueOf(n);
        }

Powyższy kod to raczej idiotyzm, metoda init(), która w apletach jest odpowiednikiem konstruktora, wywołuje konstruktor klasy Kwadrat zatem tworzy nowy Aplet (którego nie widać) i na rzecz tego niewidocznego apletu wywołuje metodę losowanieKwadratow() zmieniającą wartość n. W wyświetlanym aplecie zostaje wartość n wynikająca z tego wiersza:

int n; //tzn. n=0

Powinno być tak:

import java.awt.*;
import java.util.*;
import java.applet.*;

public class Kwadraty extends Applet{
        Random losowanie;
        int n;
        String str = "   ";
        int losowanieKwadratow(){
                   losowanie = new Random();
                   n = losowanie.nextInt(10);
                   return n;
                   }
        public void init(){
        losowanieKwadratow();
        str += toString().valueOf(n);
        }
        public void paint(Graphics g){
                g.drawLine(12, 10, 12, 13);
                g.drawLine(1,4,67,89);
                g.drawString(str, 40, 20);
        }
}
0

@Zjarek, używa nie tylko czasu

    public Random() {
        this(seedUniquifier() ^ System.nanoTime());
    }

    private static long seedUniquifier() {
        // L'Ecuyer, "Tables of Linear Congruential Generators of
        // Different Sizes and Good Lattice Structure", 1999
        for (;;) {
            long current = seedUniquifier.get();
            long next = current * 181783497276652981L;
            if (seedUniquifier.compareAndSet(current, next))
                return next;
        }
    }

    private static final AtomicLong seedUniquifier
        = new AtomicLong(8682522807148012L);
1

A może dlatego, że w metodzie init tworzysz nową (!) instancję apletu, następnie wołasz metodę na rzecz tej (nowej) instancji, która zmienia jej pole n, a na końcu odczytujesz pole n z aktualnej (właściwej) instancji apletu, które to zawsze wynosi 0, bo nigdy nie jest inicjowane.

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