Wie kann ich eine Wahrscheinlichkeit in Java hinzufūgen?

6 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Das geht ganz einfach mit

Math.random() < chance

Wobei chance ein Double zwischen 0 (0%) und 1 (100%) ist. 30% wären also 0.3.

Dein Beispiel:

boolean isHead = Math.random() < 0.3;

isHead ist mit einer Chance von 30% true (-> Kopf), und zu 70% false (-> Zahl).

Woher ich das weiß:Studium / Ausbildung – Bachelor in Informatik 👨🏻‍🎓
Mythxx103 
Fragesteller
 11.08.2021, 16:31

Danke, geht, fange aber irgendwie immer, also ist immer true,

String i2 = JOptionPane.showInputDialog("Was für einen Ball möchtest du benutzen ? ");

if (i2.equals("Standardball")) {

boolean isHead = Math.random() < 0.4;

if (isHead = true) {

    JOptionPane.showMessageDialog(null, "gefangen");
    System.exit(0);

} else JOptionPane.showMessageDialog(null, "geflohen.");
System.exit(0);

ist das nur glück ?

0
JeyKey55  11.08.2021, 16:35
@Mythxx103

Beim if statement nur isHead oder isHead == true in Klammern haben, ansonsten passiert es, dann isHead auf true gesetzt wird und dadurch immer true zurückgegeben wird.

1
Mythxx103 
Fragesteller
 12.08.2021, 09:36

Hi, weißte warum das nicht funktioniert ?

timer4.schedule(new TimerTask() {
        @Override
        public void run() {

            System.out.println("1...");

        }
    }, 2 * 1000);

Timer timer5 = new Timer();
timer5.schedule(new TimerTask() {
    @Override
    public void run() {

        System.out.println("2...");

    }
}, 2 * 1000);

Timer timer6 = new Timer();
timer6.schedule(new TimerTask() {
    @Override
    public void run() {

        System.out.println("3...geflohen...");
        System.out.println("Dein aktueller Stand sieht so aus : + Stand " 
        System.exit(0);
    }
}, 2 * 1000);

Das wird irgendwie immer so ausgegeben 1...3...2...

0
MrAmazing2  12.08.2021, 11:16
@Mythxx103

Du hast alle drei auf 2 Sekunden gestellt. Da isses ja eigentlich Zufall in welcher Reihenfolge sie ausgeführt werden. Die sind nicht auf die Nanosekunde genau.

1
Mythxx103 
Fragesteller
 12.08.2021, 11:20
@MrAmazing2

Achsoo stimmt, wie kann ich denn ne Reihenfolge festlegen? Dachte Java arbeitet das alles von oben nach unten ab oder sowas.

0
MrAmazing2  12.08.2021, 11:25
@Mythxx103

Scheduler/Timer werden in extra Threads ausgeführt, da gibt‘s dann kein Nacheinander bzw. von oben nach unten mehr, sondern das läuft parallel.

Warum machst du‘s nicht einfach so?

Timer timer4= new Timer();
timer4.schedule(new TimerTask() {
    @Override
    public void run() {

        System.out.println("1...");
        System.out.println("2...");
        System.out.println("3...geflohen...");
        System.out.println("Dein aktueller Stand sieht so aus : + Stand " 
        System.exit(0);
    }
}, 2 * 1000);
1
MrAmazing2  12.08.2021, 11:27
@Mythxx103

Du könntest auch eine Reihenfolge festlegen, indem du das

2*1000

zu unterschiedlichen Werten änderst.

Also z.B.

2*1000 beim ersten

2*1000 + 1 beim zweiten

2*1000 + 2 beim dritten

Dann wird das mit einer Millisekunde Abstand ausgegeben.

Oder warum nicht gleich mit einer Sekunde Abstand, macht für einen Countdown am meisten Sinn.

2*1000

3*1000

4*1000

1
Mythxx103 
Fragesteller
 12.08.2021, 11:28
@MrAmazing2

Hātte es halt gerne nacheinander ausgefūhrt weil man dann so einen spannenden Moment hat.

0
MrAmazing2  12.08.2021, 11:31
@Mythxx103

Achso, du willst das eine 2 Sekunden nach dem anderen ausführen?

Jetz versteh ich was du da machen wolltest haha.

1..

(2 Sekunden warten)

2..

(2 Sekunden warten)

3.. Dein aktueller Stand ...

So, oder? :D

Du könntest anstatt den Timern einfach Thread.sleep(2000) benutzen um dein Programm 2 Sekunden einzufrieren.

Also

...println(1..)

Thread.sleep(2000);

...println(2..)

Thread.sleep(2000);

...println(3... Dein aktueller Stand ...)

1

Hey,

lasse dir eine Zufallszahl zwischen 0-9 generieren. 0-2 wären deine 30% und die 3-9 deine 70%.
Kannst das ganze natürlich auch mit Zahlen von 0-99 oder 0-999 und so weiter machen.

Mfg Jannick (L1nd)

Woher ich das weiß:eigene Erfahrung
MrAmazing2  11.08.2021, 15:10

Oder einfach eine Kommazahl zwischen 0 und 1. Dann gehen auch ganz genau Wahrscheinlichkeiten, 33.75% oder sowas.

2
Mythxx103 
Fragesteller
 11.08.2021, 15:16

Hey, danke, habe das jetzt meinem Programm hinzugefūgt. Habe noch eine Frage, wie kann ich machen, dass jede Minute ein Befehl ausgefūhrt wird?

0
MrAmazing2  11.08.2021, 15:22
@Mythxx103

Mit einem Scheduler.

Runnable helloRunnable = () -> {
    public void run() {
        System.out.println("Hello world");
    }
};

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(helloRunnable, 0, 60, TimeUnit.SECONDS);

Oder per Timer:

Timer t = new Timer();
t.schedule(new TimerTask() {
    @Override
    public void run() {
       System.out.println("Hello World");
    }
}, 0, 60000);
1
Von Experte MrAmazing2 bestätigt

Du könntest dir einfach eine Zufallszahl zwischen 0 und 1 generieren (oder einem anderen Intervall) und dann überprüfen, ob der generierte Wert über oder unter einem bestimmten Wert liegt (z. B. 0,7)

Huhu. Sei X ~ U(0, 1), also uniform auf [0, 1] verteilt. Dann ist

Y = 0.5 * (1 + sign(p - X)) ~ Bernoulli(p), denn es gilt

P(Y=1) = P(sign(p - X) = 1) = P(X ≤ p) = p,
P(Y=0) = P(sign(p - X) = -1) = P(X > p) = 1 - p.

Was bedeutet das? Nun, das bedeutet, dass jede Bernoulli Verteilung durch eine uniform verteilte Zufallsvariable berechnet werden kann. Letzteres ist aber in Java implementiert in Form der Methode Math.random().