Probleme beim Rechnen mit BigDecimal

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hi,

ich möchte ein paar Wahrscheinlichkeiten ausrechnen, und habe versucht eine mathematische Formel zu implementieren:



Es geht hier um die Wahrscheinlichkeit eines gewissen Würfelergebnisses.
In dem obigen Bsp ist das die Formel für 6 Treffer einer Zahl bei 10 Würfen.

Aber irgendwas läuft da total schief. Anfangs scheint noch alles zu stimmen (ist ja nicht wirklich möglich die Ergebnisse auf Richtigkeit abzuschätzen bei sowas).

Hier mal ein Auszug:

Code:
1 mal die gleiche Zahl bei 1 Würfeln: 16.67 %
1 mal die gleiche Zahl bei 2 Würfeln: 30.56 %
1 mal die gleiche Zahl bei 3 Würfeln: 42.13 %
1 mal die gleiche Zahl bei 4 Würfeln: 51.77 %
1 mal die gleiche Zahl bei 5 Würfeln: 59.81 %
1 mal die gleiche Zahl bei 6 Würfeln: 66.51 %
1 mal die gleiche Zahl bei 7 Würfeln: 72.09 %
1 mal die gleiche Zahl bei 8 Würfeln: 76.74 %
1 mal die gleiche Zahl bei 9 Würfeln: 80.62 %
1 mal die gleiche Zahl bei 10 Würfeln: 83.85 %
1 mal die gleiche Zahl bei 11 Würfeln: 86.54 %
1 mal die gleiche Zahl bei 12 Würfeln: 88.78 %
[COLOR="Red"]1 mal die gleiche Zahl bei 13 Würfeln: 28.13 %
1 mal die gleiche Zahl bei 14 Würfeln: 2.06 %
1 mal die gleiche Zahl bei 15 Würfeln: 2.24 %[/COLOR]

Also 16% (= 1/6) bei einem Wurf stimmt ja eindeutig, und es scheint zumindest
einigermaßen sinnig wie die Werte sich verhalten, bis es zu Würfen >= 13 kommt.
Die Wahrscheinlichkeit für einen Treffer bei 13 Würfen kann ja nicht 80% geringer sein als die für 12 Würfe.

Ich bitte euch deshalb mal, meinen Code anzukucken, ich habe mit BigDecimal noch nie etwas gemacht, und generell nicht so die Erfahrung mit Kalkulationen dieser Größenordnung beim Programmieren. Wer weiss was da alles schief laufen kann.

Ich danke!

Java:
public class Wuerfel {

	public static void main(String[] args) {

		// w = Anzahl Würfel, also ganz einfach Anzahl der Würfe
		for (int w = 1; w <= 15; w++) {

			// Verlangte Anzahl an Treffern einer Zahl:
			// (welche ist ja egal, sind ja alle gleich wahrscheinlich)
			int t = 1;

			// Dies wird die Wahrscheinlichkeit für t Treffer aus w Würfen:
			BigDecimal p = new BigDecimal(0);

			// Laut Formel wird, von der Anzahl der verlangten Treffer
			// beginnend, eine Summe
			// gebildet (bis Summen-Index == Anzahl Würfel)

			for (int s = t; s <= w; s++) {
				// 1/6:
				BigDecimal einSechstel = new BigDecimal(divide(
						new BigDecimal(1.0), new BigDecimal(6.0)).doubleValue());
				// 1 - 1/6:
				BigDecimal einsMinusEinSechstel = new BigDecimal(1.0)
						.subtract(einSechstel);
				// Die Wahrscheinlichkeit für diesen Durchgang der Summe:
				// Es werden einige eigene Funktionen aufgerufen, siehe unten.
				BigDecimal chance = (ueber(w, s).multiply(einSechstel.pow(s))
						.multiply(einsMinusEinSechstel.pow(w - s)));
				// Wir addieren die Wahrscheinlichkeit für diesen Durchlauf zu
				// der Gesamt-Wahrscheinlichkeit
				p = p.add(chance);
			}
			// Wenn wir hier ankommen, wurde "p" (w-s) mal aufaddiert, und darin
			// sollte nun
			// die Gesamt-Wahrscheinlichkeit stehen:
			System.out.println(t + " mal die gleiche Zahl bei " + w
					+ " Würfeln: " + toPerc(p));

		}

	}

	// Berechnet "oben über unten":
	private static BigDecimal ueber(int oben, int unten) {
		BigDecimal fakOben = new BigDecimal(fak(oben)); // oben!
		BigDecimal fakUnten = new BigDecimal(fak(unten)); // unten!
		BigDecimal fakObenMinusUnten = new BigDecimal(fak(oben - unten)); // (oben-unten)!

		// (oben!) / ((unten!) * (oben-unten)!)
		BigDecimal ret = new BigDecimal(divide(fakOben,
				fakUnten.multiply(fakObenMinusUnten)).doubleValue());
		return ret;
	}

	// Berechnet die Fakultät z!
	private static int fak(int z) {
		if (z == 0 || z == 1) {
			return 1;
		}
		int fak = z;
		for (int prev = (z - 1); prev > 1; prev--) {
			fak *= prev;
		}
		return fak;
	}

	// wandelt eine Zahl in Prozent um, zB 0.5 -> 50 %
	private static String toPerc(BigDecimal d) {
		d = d.multiply(new BigDecimal(100));
		return new DecimalFormat("#.##").format(d) + " %";
	}

	// eigene Divide Methode, bei der ein Scale angegeben ist, sonst kann es zu
	// Brüchen
	// mit unendlichen Nachkommastellen kommen (zB 1/3), was zu einer Exception
	// führt.
	private static BigDecimal divide(BigDecimal v1, BigDecimal v2) {
		BigDecimal ret = v1.divide(v2, 10, RoundingMode.HALF_UP);
		return ret;
	}
}

PS: Die Formel hab ich aus einem Mathe-Forum, ich gehe stark davon aus dass die also stimmt!
 
S

SlaterB

Gast
1800 Postings und keine Idee das selber herauszufinden, Zwischenwerte anschauen?
wenn du das hier nicht übst, wie soll das bei richtigen Problemen klappen?

Tipp um die Menge der Berechnungen zu reduzieren:
berechne nur
for (int s = t; s <= 1; s++) {


--------

hier noch ein richtiger Tipp:

Java:
	static final DecimalFormat PERCENT_FORMAT = new DecimalFormat("#.##%");
	// wandelt eine Zahl in Prozent um, zB 0.5 -> 50 %
	private static String toPerc(BigDecimal d) {
		return PERCENT_FORMAT.format(d);
	}

	static final BigDecimal einSechstel = divide(BigDecimal.ONE, new BigDecimal("6"));
	static final BigDecimal einsMinusEinSechstel = BigDecimal.ONE.subtract(einSechstel);


----

wieso rechnest du
new BigDecimal(divide().doubleValue());

divide() liefert doch schon einen BigDecimal?

-------
unabhängig davon besser nie new BigDecimal(double) verwenden, teste

System.out.println(new BigDecimal(2.3));
System.out.println(BigDecimal.valueOf(2.3));
System.out.println(new BigDecimal("2.3"));
 
Zuletzt bearbeitet von einem Moderator:

Painii

Bekanntes Mitglied
Du rechnest in fak() mit primitivem int -> bei 13! war da glaub ich irgendwann Schluss (Überlauf).
 
S

SlaterB

Gast
macht das jetzt Sinn, meine pädagogischen 'bitte selber herausfinden'-Ratschläge ad absurdum zu führen?
 

Painii

Bekanntes Mitglied
Ich seh das ganze grade mal als einen Fall von "betriebsblind" an, ich hatte auch schon solche Tage...

Mir hat es in dem Fall (Implementierung der Fakultät) auch nicht geholfen zu sagen "such mal selber", sondern dass mir jemand gesagt hat "da ist der Fehler"...
Und weil mir das suchen da selbst nichts gebracht hat ausser Frust (ich hab irgendwo Fehler gesucht und Stunden das Programm umgeschrieben) will ich das nicht anderen auch antun.
 

hdi

Top Contributor
Hey Leute, danke für die Hilfe. Lag wohl wirklich am int der Fakultät. Hatte das eig. mal gegen long ausgetauscht (jetzt BigInteger, nur um sicher zu sein), aber zu dem Zeitpunkt war wohl noch woanders ein Fehler drinnen.

@SlaterB: Das Problem war, dass ich nie zu 100% wusste, ob es nun zu Rechenfehlern kommt oder ob ich die Formel falsch implementiert habe (rein sinngemäß). Zustäzlich kann man die Ergebnisse nicht wirklich nachrechnen (dauert per Hand einfach zu lange) oder abschätzen.
Ich saß ungelogen seit über 5 Stunden an diesem Mist, und ich habe noch nie mit solchen Werten gerechnet. Ich hatte einfach sowas von keinen Bock mehr :bae:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Probleme beim rechnen, bei Zahlen mit führenden Nullen. Allgemeine Java-Themen 7
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
B Compiler-Fehler Probleme beim Kompilieren mit Jsoup Allgemeine Java-Themen 8
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
perlenfischer1984 Probleme beim Mocken Allgemeine Java-Themen 6
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
W JNDI - LDAP - Probleme beim editieren von Usern Allgemeine Java-Themen 0
N Zahlensysteme umrechnen; Probleme beim Umwandeln Allgemeine Java-Themen 4
A Probleme beim auslesen von Quelltext (HTML) Allgemeine Java-Themen 5
M 3D-Grafik Probleme beim drehen von Objekten Allgemeine Java-Themen 9
S Probleme beim Auslesen einer Liste Allgemeine Java-Themen 8
H Probleme beim Erstellen einer txt. Datei Allgemeine Java-Themen 7
S Probleme beim Start von jar Datein Allgemeine Java-Themen 15
S Probleme beim Compilen Allgemeine Java-Themen 8
N Probleme mit Umlauten beim Einlesen Allgemeine Java-Themen 6
P Probleme beim Signieren Allgemeine Java-Themen 2
D Probleme beim schreiben / lesen in TreeMap Allgemeine Java-Themen 9
S Probleme beim Anzeigen des Dateiinhalts Allgemeine Java-Themen 6
O Probleme beim vergleichen von 2 Datumsangaben Allgemeine Java-Themen 2
V Probleme beim Drucken mehrerer PDF's Allgemeine Java-Themen 17
E Probleme beim Umstieg auf Version 1.6.0_12 Allgemeine Java-Themen 4
J Java Plugin probleme beim Laden? Allgemeine Java-Themen 3
V Probleme beim Lesen mit readObject -> InvalidClassExcepti Allgemeine Java-Themen 3
D Probleme beim Umstellen von iText 1.4.4 auf Version 2.1.2 Allgemeine Java-Themen 5
G Probleme beim Sichern von Properties Allgemeine Java-Themen 2
W Probleme beim Ausführen einer Java Klasse auf Kommandozeile Allgemeine Java-Themen 17
S Probleme beim Einstieg Allgemeine Java-Themen 3
F Probleme beim speichern einer xml datei mit jdom Allgemeine Java-Themen 5
D Probleme beim FAQ (JTextField: Dokumentarten) Allgemeine Java-Themen 5
B probleme beim compilen/decompilen Allgemeine Java-Themen 4
G Probleme beim Mail-Api mit BCC Allgemeine Java-Themen 2
M Probleme beim ausführen meiner Klasse Allgemeine Java-Themen 8
G probleme beim sortieren einer ArrayList Allgemeine Java-Themen 8
G Probleme beim Entzippen Allgemeine Java-Themen 4
G jdk1.5 Probleme beim Installieren unter Win Allgemeine Java-Themen 2
J Probleme mit der CommApi beim ProgrammStart über Konsole Allgemeine Java-Themen 2
P Probleme beim Einlesen einer TXT/CSV-Datei aus einem JAR Allgemeine Java-Themen 7
C Probleme beim Starten eines Java-Programms Allgemeine Java-Themen 2
E Probleme beim Zugriff auf verschachtelte Vektoren Allgemeine Java-Themen 16
G Probleme beim Verbinden auf einen Notes 5 Server Allgemeine Java-Themen 3
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
C Probleme mit javax.mail.Session Allgemeine Java-Themen 8
M tomcat probleme Allgemeine Java-Themen 1
N Division macht Probleme Allgemeine Java-Themen 14
MarvinsDepression Probleme mit relativem Dateipfad Allgemeine Java-Themen 1
G Geotools Probleme nach PC-Wechsel Allgemeine Java-Themen 6
nibe1501 GUI Probleme Allgemeine Java-Themen 16
C Probleme mit dem WindowBuilder Allgemeine Java-Themen 3
P Selenium . Probleme ein Iron Icon Element anzusprechen Allgemeine Java-Themen 2
K VisualVM Profiling Remote Probleme Allgemeine Java-Themen 1
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
M Probleme bei Eclipse wenn ich entpacke Allgemeine Java-Themen 15
D Regex Probleme Allgemeine Java-Themen 2
M Probleme jar datei. Allgemeine Java-Themen 2
L Vererbung Verständnis Probleme Vererbung Allgemeine Java-Themen 2
Dann07 Probleme mit OpenAL Allgemeine Java-Themen 0
V Compiler-Fehler Online Compiler Probleme Allgemeine Java-Themen 4
M Probleme mit Negamax-Algorithmus Allgemeine Java-Themen 29
M Probleme mit BigDecimal Allgemeine Java-Themen 1
T Probleme mit NumberFormat Allgemeine Java-Themen 5
J Probleme exe-Start mit Task Scheduler Allgemeine Java-Themen 1
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
K Data Konverter - Probleme mit Byte[] Kodierung Allgemeine Java-Themen 3
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
H Swing HashMap zu Tabelle macht mir Probleme Allgemeine Java-Themen 4
Neoline Interpreter-Fehler Probleme mit Arrays.toString Allgemeine Java-Themen 7
J Erste Schritte Probleme mit der Hauptklasse Allgemeine Java-Themen 14
J Tetris Probleme bei Klassen Allgemeine Java-Themen 14
J MinMax VierGewinnt Probleme Allgemeine Java-Themen 22
J Probleme mit CodeCoverage und Lombok Equals Allgemeine Java-Themen 1
R Snake Probleme Allgemeine Java-Themen 2
RalleYTN 3D Objekt Translation basierend auf Rotation (Probleme mit Z Rotation) Allgemeine Java-Themen 0
Bluedaishi Druck Probleme mit PDF dateien Allgemeine Java-Themen 4
G Ant Probleme bei einer Installation die Apache ant+ivy verwendet Allgemeine Java-Themen 14
E TableView Probleme Allgemeine Java-Themen 7
S Kaffemaschine Programmierung Probleme Allgemeine Java-Themen 2
K Threads Runtime und Process Probleme Allgemeine Java-Themen 3
S Probleme mit unterschiedlichen Java-Versionen (Mac OS X 10.11) Allgemeine Java-Themen 0
S Event Handling keyPressed()-Probleme Allgemeine Java-Themen 2
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
P Probleme mit Grafik (Java) Allgemeine Java-Themen 6
H Probleme mit DAY_OF_WEEK Allgemeine Java-Themen 4
Arif Probleme mit NullPointerException Allgemeine Java-Themen 2
E Probleme mit nextInt() und Exception Allgemeine Java-Themen 35
Streeber Probleme mit AWT-EventQueue: ArrayList Elemente hinzufügen Allgemeine Java-Themen 1
D Performance-Probleme mit Joda-Time Allgemeine Java-Themen 3
RalleYTN Probleme mit Encrypting Allgemeine Java-Themen 10
M Probleme mit Schriftarten PDFBox Allgemeine Java-Themen 3
J Probleme mit der Java-Runtime Allgemeine Java-Themen 10
G Probleme mit BufferedWriter und URL Allgemeine Java-Themen 4
S Probleme mit meinem MacBook Pro DRINGEND HILFE erbeten! Allgemeine Java-Themen 17
Androbin Interpreter-Fehler Probleme mit Rekursion - StackOverflowError Allgemeine Java-Themen 8
M Runtime.exec() verursacht auf manchen Systemen Probleme - Ursache unklar Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben