Problem mit Methodenaufruf in Konstruktor

Status
Nicht offen für weitere Antworten.

Bishops

Mitglied
Hallo, habe ein Problem mit dem Aufruf einer abstrakten Methode der Superklasse im Konstruktor einer Subklasse:

Ich habe folgende abstrakte Oberklasse:
Java:
public abstract class Distribution {

	
	/**
	 * uniform distribution for x-axis values
	 */
	private Uniform uniform1;
	/**
	 * uniform distribution for function
	 */
	private Uniform uniform2;
	

	
	/**
	 * This method sets the borders of the distribution of value r1
	 * @param a1 The lower limit of the domain of the function
	 * @param b1 The upper limit of the domain of the function
	 */
	public void adjustU1(double a1, double b1){
		this.uniform1 = new Uniform((double)System.currentTimeMillis(),a1,b1);
	}
	
	
	/**
	 * This method sets the borders of the distribution of value r2
	 * @param a2 The lower limit of the codomain of the function
	 * @param b2 The upper limit of the codomain of the function
	 * 
	 */
	public void adjustU2(double a2, double b2){
		this.uniform2 = new Uniform((double)System.currentTimeMillis(),a2,b2);
	}
	
	
	/**
	 * The function of the distribution
	 * @param x
	 * @return
	 */
	protected abstract double function(double x);
}

Die Subklasse sieht so aus:
Java:
public class Normal extends Distribution {

	
	private double mean;
	private double deviation;
	
	public Normal(double mean, double deviation){
		super();
		this.mean=mean;
		this.deviation=deviation;
		
		super.adjustU1(-3*deviation+mean, 3*deviation+mean);
//Wenn dieses sysout auskommentiert ist funktioniert das ganze		
//System.out.println(mean);
		super.adjustU2(0, this.function(mean));
		
		
	}
	

	
	protected double function(double x) {
		return (1/(this.deviation*Math.sqrt(2*Math.PI)))*Math.exp(((x-this.mean)*(x-this.mean))/(-2*this.deviation*this.deviation));
	}

}

Wenn ich das ganze normal laufen lasse funktioniert es nicht so wie gewollt,
da der letzte Methodenaufruf im Konstruktor der Subklasse (mit this.function()) nicht richtig ausgewertet wird, glaube ich.

Das merkwürdige ist, dass das ganze funktioniert, wenn ich vor die letzte Methode ein Sysout mit einem der beiden Parameter des Konstruktors der Subklasse übergebe.

Danke schon mal für die Hilfe
 
S

SlaterB

Gast
was ist denn der Unterschied zwischen funktionieren und 'nicht funktionieren'

Exception, Compiler-Fehler, welche exakten Ausgaben?
dein Programm enthält weder main-Methode noch irgendwo System.out.println,
von der auskommentierten Zeile abgesehen, aber die kann ja kaum was für andere Ergebnisse aussagen
 

Bishops

Mitglied
Hier ist die Main Klasse:

Java:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

import model.Exponential;
import model.Normal;
import model.Uniform;


public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		Normal n = new Normal(0.0, 1.0);
		
		int number = 100000;
		
		
		float[] normal = new float[number];
		
		//Generate random numbers
		for(int i=0;i<number;i++){
			
			normal[i]=n.normal();
		}
		
		int histSize=1000;
		
		//Generate histogram
		
		int[] nHist = generateHistogram(normal,histSize);
		
		//Generate output picture
		
		generatePicture(nHist, "nHist.pgm");
		   
		    
		    
		    
		    
		
		

	}
	
	private static int[] generateHistogram(float[] values, int n){
		....
		
	}
	
	private static void generatePicture(int[] data, String name){
	...
	}

}

Mit dem sysout sieht das Histogramm dann so aus wie es soll (nHist-cor.png im Anhang)

Ohne das sysout entsteht eine Verteilung, die ich mir überhaupt nicht erklären kann.
Der einzige Unterschied bei der Erstellung der beiden Bilder war nur das auskommentieren des Sysout.
 
S

SlaterB

Gast
tja, ausschließen soll man nix,
aber nachvollziehen kann ich es leider immer noch nicht,
wenn irgendwo ein PNG gemalt wird, ist das ja auch nicht zu testen

schaue dir die Werte von float[] normal oder einem der anderen Arrays in beiden Versionen an und finde einen reproduzierbaren Unterschied,
der ist dann hoffentlich erklärbar
 

Bishops

Mitglied
So wird das Histogramm und das Bild generiert:

Java:
private static int[] generateHistogram(float[] values, int n){
		int a = -3;
		int b = 3;
		int[] ret = new int[n];
		float size = (b-a)/(float)n;
		
		for(float v:values){
			if(v>a && v<b){
				ret[(int)((v-a)/size)]++;
			}
			
		}
		
		
		return ret;
		
		
	}
	
	private static void generatePicture(int[] data, String name){
		
	    	try {
		    	FileWriter fstream = new FileWriter(name);
		        BufferedWriter out = new BufferedWriter(fstream);
				out.write("P2\n" +
						"#Histogram\n" +
						data.length + " " + data.length +
						"\n255\n");
				//find maximum
				int max=0;
				for(int i=0;i<data.length;i++){
					if(data[i]>max){
						max=data[i];
					}
				}
				float ratio = data.length/(float)max;
				
				for(int i=data.length;i>0;i--){
					for(int j=0;j<data.length;j++){
						if(data[j]*ratio<i){
							out.write("255 ");
						} else{
							out.write("0 ");
						}
					}
				}
				//Close the output stream
			    out.close();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
	    
	    
	    
	}
Und als Anhang der gesamte Sourcecode,
ich hoffe es ist damit nachvollziehbar
 
Zuletzt bearbeitet:
S

SlaterB

Gast
nur den Code posten, so war das aber nicht gedacht ;)
aber immerhin konnte ich auch gleich den Fehler reproduzieren und selber suchen wäre wohl zu schwer


Spitzenfehler, das bekommt man hier nicht oft geboten,
hab erst ewig versucht, die Berechnungen zu verstehen und dann dort nach besonderen Werten gesucht,

die Verteilungen für r1 und r2 in Distribution.distribution() sind an sich nicht besonders auffällig,
aber ohne das System.out.println() ist bei r1 im Bereich von -2.9 der Wert für r2 immer < 0.2,
deshalb wird das r1 im Bereich von -2.9 recht häufig akzeptiert, deshalb im zweiten Bild ganz links dieser Piekser

daraus habe ich geschlossen, dass die beiden Uniforms nicht voneinander unabhängig sind,
nachdem das nach 1 1/2 Stunden feststand war es leicht,
hätte ich auch gleich mal nachschauen können:

an Uniform wird die aktuelle Systemzeit als Initialwert für den Zufallsgenerator übergeben, und dabei auch noch auf double gecastet,
also werden die letzten wichtigsten, möglicherweise leicht unterschiedlichen Ziffern genau noch abgeschnitten,
bei direktem Aufruf hintereinander kann die Systemzeit eh gleich sein
-> beide Uniforms verwenden dieselbe Zufallsreihe, damit brauch man sich über nix mehr zu wundern

das System.out.println() des Wertes hat auf den Wert bezogen wie zu erwarten keinen Einfluss,
es geht allein darum, dass es etwas Zeit dauert und damit für zwei verschiedene Systemzeiten als Zufallsgeneratoren gesorgt wird,

ein System.out.println() ohne den Wert würde genauso helfen, das wäre auch ein guter Hinweis gewesen,
habe ich auch vergessen zu testen ;)

------

also:
unbedingt dafür sorgen, dass die Seeds der Uniform verschieden sind,
da gibts verschiedene Varianten,
z.B. nicht direkt System.currentTimeMillis() abfragen, sondern über eine spezielle Methode,
die erst 100 ms wartet,
oder eine statische Variable 1,2,3 hochzählen und miteinfließen lassen,

wenn das Seed als double gespeichert wird, dann auch eher kleine Zahlen nehmen, z.B.
System.currentTimeMillis() % 10000, das hat 5 Stellen weniger, und zwar werden die vorderen Stellen gestrichen


mit all dem kann man aber wohl nicht verhindern, dass rein zufällig mal zwei Seeds gleich sind,
noch besser ist wohl:
alle potentiellen Seeds in einem Set speichern, wenn schon vorhanden dann ein anderes Seed wählen,
Problem wenn irgendwann mal alle Werte vergeben sind..

oder nur eine Zufallsfolge im ganzen Programm, zumindest in den Bereichen, die voneinander abhängen,
jeder kann da abwechselnd was abfragen,
abwechseln klingt zwar auf gefährlich, aber der n+1-Wert sollte eigentlich in keiner besonderen Relation zum n-ten Wert stehen
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Frage und Antwort Programm, Problem bei Methodenaufruf Allgemeine Java-Themen 3
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
Max246Sch Backtracking Problem Box Filler Allgemeine Java-Themen 6
NightVision402 VisualVM Startskript Problem Allgemeine Java-Themen 3
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
F Problem mit PDFBOX Library Allgemeine Java-Themen 1
A Java modul Problem Allgemeine Java-Themen 4
D Read JSON File Problem Allgemeine Java-Themen 9
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
J Problem mit JasperReports Allgemeine Java-Themen 8
M log4j Problem mit jlink Allgemeine Java-Themen 19
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
P Selenium . getText Problem Allgemeine Java-Themen 9
A Jar zu Exe Problem Allgemeine Java-Themen 13
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
A Thread.sleep Problem Allgemeine Java-Themen 2
A Problem bei der Nachbarschafttest Allgemeine Java-Themen 11
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
Splayfer JDA Problem mit MessageCounter Allgemeine Java-Themen 0
Splayfer Problem mit BufferedWriter Allgemeine Java-Themen 3
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
N Maven Problem mit Datenbanktreiber (H2 Embedded) Allgemeine Java-Themen 12
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
C ArrayList Problem Allgemeine Java-Themen 3
kev34 nim-Spiel problem Allgemeine Java-Themen 1
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
G Welches Problem besteht bei den Typparametern? Allgemeine Java-Themen 5
temi Problem mit Aufrufreihenfolge bei Vererbung Allgemeine Java-Themen 3
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
T PIM basierend auf netbeans via AnyDesk Problem Allgemeine Java-Themen 3
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
Kirby.exe Verständnis Problem bei Rucksack Problem Allgemeine Java-Themen 6
B Eclipse-Lombok-Problem Allgemeine Java-Themen 19
I Input/Output ObjectOutputStream - Problem Allgemeine Java-Themen 7
1 Multiple Choice Knapsack- Problem Allgemeine Java-Themen 2
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
E Problem mit Gridlayout und Button Allgemeine Java-Themen 2
A Array Problem Allgemeine Java-Themen 8
bueseb84 Problem Allgemeine Java-Themen 0
S Problem mit Arrays Allgemeine Java-Themen 1
D Nullpointer Exception Problem Allgemeine Java-Themen 5
B Problem mit meinen Klassen Allgemeine Java-Themen 6
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
J Problem bei Install java 13 Allgemeine Java-Themen 3
X Profitable Reise Problem Allgemeine Java-Themen 32
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
Dann07 Problem mit JavaMail API Allgemeine Java-Themen 26
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
J Clear-Problem Allgemeine Java-Themen 10
B Problem zu einem Java Projekt Allgemeine Java-Themen 6
S JFileChooser Problem Allgemeine Java-Themen 4
M Traveling Salesman - MST Heuristik Problem Allgemeine Java-Themen 4
J Traveling Salesman Problem Allgemeine Java-Themen 14
E Java Editor Problem mit 2er Exceptions Allgemeine Java-Themen 12
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
S Methoden Problem mit NullPointerException Allgemeine Java-Themen 9
Javafan02 Problem mit if-clause Allgemeine Java-Themen 17
J Lombok Problem mit Konstruktoren bei Verberbung Allgemeine Java-Themen 1
kodela Event Handling Problem mit der Alt-Taste Allgemeine Java-Themen 16
W Threads Problem Allgemeine Java-Themen 15
D (Verständnis-)Problem mit Unterklasse Allgemeine Java-Themen 4
S Problem mit Generic bei unmodifiableCollection Allgemeine Java-Themen 4
S jserialcomm Problem Allgemeine Java-Themen 1
Flynn Thread-Problem... Allgemeine Java-Themen 2
J Generische Interface - Problem Allgemeine Java-Themen 3
G Problem beim GUI Allgemeine Java-Themen 9
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
T Problem mit externen Datenbankzugriff über SSH Tunnel Allgemeine Java-Themen 4
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
S Java OpenOffice Problem mit Windows-Benutzerwechsel Allgemeine Java-Themen 19
K Threads RAM Problem Allgemeine Java-Themen 20
P Operatoren Problem mit Zähler in recursiver Schleife Allgemeine Java-Themen 2
C Int Problem Allgemeine Java-Themen 8
C J2V8 NodeJs Java Bride Problem und Frage!?!? Allgemeine Java-Themen 1
J Problem bei Hashmap Key-Abfrage Allgemeine Java-Themen 4
C Webseiten Programm problem Allgemeine Java-Themen 5
M LocalDate Problem Allgemeine Java-Themen 4
J "Problem Objektorientierung" Allgemeine Java-Themen 20
geekex Problem Meldung! Was tun?! Allgemeine Java-Themen 19
T Klassen Override Problem Allgemeine Java-Themen 7
L Unbekanntes Problem Allgemeine Java-Themen 1
FrittenFritze Problem mit einer JComboBox, Event temporär deaktivieren Allgemeine Java-Themen 11
Blender3D Java Swing Programm Windows 10 Autostart Problem Allgemeine Java-Themen 2
F HTTPS Zertifikat Problem Allgemeine Java-Themen 3
M OpenCV KNearest Problem Allgemeine Java-Themen 0
Tommy Nightmare Project Euler: Problem 22 Allgemeine Java-Themen 2
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
P Eclipse Projekt anlegen macht Problem Allgemeine Java-Themen 1
RalleYTN META-INF/services Problem Allgemeine Java-Themen 3
F Java Mail Problem: Authentifizierung wird nicht immer mitgeschickt Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben