Wahrscheinlichkeiten für Slot Machine

Diskutiere Wahrscheinlichkeiten für Slot Machine im Java Basics - Anfänger-Themen Bereich.
T

theqwe

Hallo zusammen,

ich habe mal wieder zum lernen ein Projekt angefangen. Diesmal soll es eine Slot Machine sein, die eine frei Felder Ausgabe hat. Soweit ist alles kein Problem. Mit einer Zufallszahl (Random) kann ich die Objekte (Kirschen, Glocken, etc.) aus einem Array nehmen. Mit einer if-Anweisung prüfe ich dann, ob zwei oder drei gleiche "Bilder" vorhanden sind. Das ganze werde ich dann noch mit verschiedenen Kombinationen erweitern.

Das Problem ist, dass ich für bestimmte Objekte wie die Kirschen bestimmte Wahrscheinlichkeiten haben möchte. Z.B. soll diese nur zu 10% erscheinen. Leider bin ich in Mathe nicht der Beste und weiß nicht, wie ich das ganze umsetzen soll. Ein wenig Recherche habe ich eine Methode gefunden, in den man die Wahrscheinlichkeit der einzelnen Objekte in double Variablen speichert und mit random.nextDouble eine Zahl zwischen 0-1 generieren lässt. Irgendwie weiß ich aber ab da nicht weiter.

Wie gehe ich am besten Voran?
 
M

M.L.

Oder man bestimmt ein anderes Intervall als Treffer, z.B. 0.85 - 0.95
 
T

theqwe

Okay, mal angenommen die Kirsche hat eine Wahrscheinlichkeit von 10%, die Glocken 30% und die Orangen 60%. Ich lasse dann eine Zahl zufällig generieren und wenn sie sich im Bereich des Objektes befindet, dann wird diese gewählt? Dann wäre der Bereich für Kirsche 0.0 - 0.1, für Glocken 0.2 - 0.4 und Orangen 0.5 - 1.0?

Java:
//...
Random random = new random();
double zufallsZahl = random.nextDouble();
String objekt = "";

if(zufallsZahl <= 0.1) {
    objekt = "Kirsche";
}
else if(zufallsZahl > 0.1 || zufallsZahl < 0.5) {
    objekt = "Glocken";
}
else {
    objekt = "Orangen";
}
//...
 
MoxxiManagarm

MoxxiManagarm

Du hast jetzt 10-40-50 und nicht 10-30-60, aber grundsätzlich ja. Meine persönliche Vorliebe wäre es dann nur noch auf den If-Else-Konstrukt zu verzichten und stattdessen die TreeMap zu verwenden. Beispiel:

Java:
TreeMap<Double, String> symbols = new TreeMap();
symbols.put(0.0, "Kirsche");
symbols.put(0.1, "Glocke");
symbols.put(0.4, "Orange");

for (int i = 0; i < 20; i++) {
    double rolled = Math.random();
    System.out.printf("Random %f resulted in %s%n", rolled, symbols.floorEntry(rolled).getValue());
}
Beispielausgabe:
Code:
Random 0,159581 resulted in Glocke
Random 0,563685 resulted in Orange
Random 0,199267 resulted in Glocke
Random 0,540795 resulted in Orange
Random 0,786776 resulted in Orange
Random 0,933988 resulted in Orange
Random 0,280587 resulted in Glocke
Random 0,982612 resulted in Orange
Random 0,096222 resulted in Kirsche
Random 0,658542 resulted in Orange
Random 0,270720 resulted in Glocke
Random 0,418970 resulted in Orange
Random 0,943539 resulted in Orange
Random 0,291928 resulted in Glocke
Random 0,358220 resulted in Glocke
Random 0,431333 resulted in Orange
Random 0,540847 resulted in Orange
Random 0,397839 resulted in Glocke
Random 0,063192 resulted in Kirsche
Random 0,724316 resulted in Orange
 
T

theqwe

Super vielen Dank.
Mit der TreeMap kenne ich mich noch nicht aus. Bin noch bei den Basics aus dem Studium. Ich werde das jetzt mal umsetzen und gucken, ob alles funktioniert, wie ich es mir vorstelle.
 
H

handshake45

Ich würd es an deiner Stelle vielleicht so machen:
Java:
import java.util.Random;

public class Bandit {
	private int indx = 0;
	private String[] symbols = new String[100];

	public void addSymbol(String symbol, int share) {
		for (int i = 0; i < share; i++) {
			symbols[indx++] = symbol;
		}
	}

	public String getSymbol(Random random) {
		return symbols[random.nextInt(100)];
	}

	public static void main(String[] args) {
		Random random = new Random();
		Bandit bandit = new Bandit();
		bandit.addSymbol("Kirsche", 10);
		bandit.addSymbol("Glocken", 30);
		bandit.addSymbol("Orangen", 60);
		for (int i = 1; i <= 10; i++) {
			System.out.println(i + ": " + bandit.getSymbol(random));
		}
	}
}
Code:
1: Orangen
2: Orangen
3: Orangen
4: Orangen
5: Kirsche
6: Orangen
7: Orangen
8: Orangen
9: Kirsche
10: Kirsche
 
L

lennero

1. Sortier die Elemente nach Wahrscheinlichkeit
2. Generier eine Zufallszahl zwischen 0 und der Summe aller Wahrscheinlichkeiten.
3. Summier alle Elemente, das Element welches die Summe >= Zufallszahl werden lässt, ist das "gesuchte" Element.
 
T

thecain

Ja dann füllen wir lieber ein Array mit 100/1000/10000 (je nach benötigter Genauigkeit) meist gleichen Einträgen.
 
H

handshake45

Nein in meinen Beispiel sind es lediglich 100 Elemente und ja das wäre nicht so ineffizient wie der Vorschlag von @lennero und ja ich weiß dass @thecain @lennero nur schützen möchte...
 
H

handshake45

Aber er hat nach 10% gefragt... das mit der Genauigkeit ist natürlich ein Problem, besonders bei beliebigen irrationalen Zahlen.

Aber hier sinds bislang 3 "Früchte". :)
 
T

temi

Eine Slotmachine hat ja drei Räder mit jeweils einer endlichen Anzahl von Symbolen. Jedes dieser drei Räder kann durch eine List<Symbol> repräsentiert werden, die du mit den entsprechenden Symbolen in der gewünschten Anzahl füllst, z.B. 3 Glocken, 2 Kirschen usw.

Alle drei Listen mischen (z.B. mit Collections.shuffle()) und einfach immer den ersten Eintrag ziehen.

Im Prinzip ist das hier das gleiche Problem: https://www.java-forum.org/thema/prozentuale-zufallsverteilung.187481/
 
Zuletzt bearbeitet:
Thema: 

Wahrscheinlichkeiten für Slot Machine

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben