Hallo,
wir haben den unten angegeben Code. Ich habe ein Dorf, jeder Dorfbewohner hat eine politische Einstellung. In meinem Code rot oder schwarz. Im Code wird ein zufälliger Dorfbewohner herausgesucht, dieser unterhält sich mit einem seiner NAchbarn (oben, unten, links oder rechts von ihm) und einer von beiden, bekehrt den anderen zu seiner politischen EInstellung.
Das Programm simuliert dies nun mit 40.000 Durchläufen. Jetzt möchte ich es noch so erweitern, dass ich bei jedem Schleifendurchlauf angezeigt bekomme, wie hoch die Wahrscheinlichkeit ist, ein Einparteiensystem/dorf zu erhalten.
Ich weiß nicht wie ich letzteres, also die Berechnung der Wahrscheinlichkeit im COde umsetzen soll.
Folgendes ist mein Code:
Ausgabe:
Wobei (...) für die Wahrscheinlichkeitsrechnungen stehen soll.
Ich bin für jede Hilfe dankbar!
Gruß
Fasko
PS: Später will ich das Programm noch so erweitern, dass ich mit mehr als nur zwei Parteien starte.
wir haben den unten angegeben Code. Ich habe ein Dorf, jeder Dorfbewohner hat eine politische Einstellung. In meinem Code rot oder schwarz. Im Code wird ein zufälliger Dorfbewohner herausgesucht, dieser unterhält sich mit einem seiner NAchbarn (oben, unten, links oder rechts von ihm) und einer von beiden, bekehrt den anderen zu seiner politischen EInstellung.
Das Programm simuliert dies nun mit 40.000 Durchläufen. Jetzt möchte ich es noch so erweitern, dass ich bei jedem Schleifendurchlauf angezeigt bekomme, wie hoch die Wahrscheinlichkeit ist, ein Einparteiensystem/dorf zu erhalten.
Ich weiß nicht wie ich letzteres, also die Berechnung der Wahrscheinlichkeit im COde umsetzen soll.
Folgendes ist mein Code:
Java:
public class demokratur {
/**
* @param args
*/
public static void main(String[] args) {
//@Joël, wenn nicht anders erwähnt
// .genZz(Länge der Zufallszahl) gibt eine Zufallszahl zurück
// .resetArray(Array) Übergibt 2.DimArray Bewohner, erwartet Array mit 400 Feldern!!!
//@toDos!:
// ändere Methodennamen noch in deutsche Ableger! (bsp. get und set in hole und setze)
// Fälle einbauen:
// rand rechts: x+1 Verbot, rand links: x-1 Verbot; rand oben y+1 Verbot; rand unten y-1 Verbot
// alles einzeln abfragen?
// in fuehreGespraeche einabauen, oder vorher abfragen?
// Idee: Werte für bestimmte Operationen mitgeben
char[][] claEinwohner = new char[20][20];
setUpBoxSecond cloBox = new setUpBoxSecond();
int ilvZufallX=0;
int ilvZufallY=0;
int ilvXEins;
int ilvXZwei;
int ilvYEins;
int ilvYZwei;
int ilvGesamtschleifendurchlauf=0;
// @param
//Setzt das Array auf seine Startwerte
claEinwohner = cloBox.resetArray(claEinwohner);
for (int i=0; i<40000;i++){
// such zwei Plätze aus
// Dorfbewohner Nr.1
ilvXEins=cloBox.genZz(19); // Höchster 19
ilvYEins=cloBox.genZz(19); // Höchster 19
// Übergabe an das Objekt
//cloBox.setIlvParteiA(claEinwohner[ilvXEins][ilvYEins]); // Setzt Wert für spätere Berechnungen im Objekt
// Führt das aktuelle Gespräch und bekehrt nach Regel
//cloBox.waehleNachbar(ilvXEins, ilvYEins);
cloBox.waehleNachbar(ilvXEins, ilvYEins);
// Einer bekehrt jemanden
ilvXZwei=cloBox.holeNachbarPosX();
ilvYZwei=cloBox.holeNachbarPosY();
// Kontrollausgabe, wenn gewünscht
//System.out.println("Pos2X "+ilvXZwei);
//System.out.println("Pos2Y "+ilvYZwei);
//Übergabe von zwei Charwerten
cloBox.fuehreGespraech(claEinwohner[ilvXEins][ilvYEins],claEinwohner[cloBox.holeNachbarPosX()][cloBox.holeNachbarPosY()]); // Führt Gespräch mit gewähltem Nachbar, Bekehrung
// Hole Werte zurück
claEinwohner[ilvXEins][ilvYEins]=cloBox.getIlvParteiA();
claEinwohner[cloBox.holeNachbarPosX()][cloBox.holeNachbarPosY()]=cloBox.getIlvParteiB();
// Kontrollausgabe, wenn gewünscht
//cloBox.checkArray(claEinwohner);
//System.out.println("Gesamtschleifendurchlauf "+i);
ilvGesamtschleifendurchlauf=i;
}// ende for
System.out.println("Schleifendurchlauf: "+(ilvGesamtschleifendurchlauf+1));
System.out.println("Schwarz: "+cloBox.zaehleArrayEinfach(claEinwohner, 's'));
System.out.println("Rot: "+cloBox.zaehleArrayEinfach(claEinwohner, 'r'));
}
}
Java:
import java.util.*;
public class setUpBoxSecond {
private char ilvParteiA;
private char ilvParteiB;
private char ilvParteiC;
private int ilvXNachbar=0;
private int ilvYNachbar=0;
public int holeNachbarPosX(){
return this.ilvXNachbar;
}
public int holeNachbarPosY(){
return this.ilvYNachbar;
}
public char getIlvParteiA() {
return ilvParteiA;
}
public void setIlvParteiA(char ilvParteiA) {
this.ilvParteiA = ilvParteiA;
}
public char getIlvParteiB() {
return ilvParteiB;
}
public void setIlvParteiB(char ilvParteiB) {
this.ilvParteiB = ilvParteiB;
}
// Methoden!!!!
/**
* führt das Gespräch
* bzw. hier wird bekehrt
* @param clvEinstellungPersonA
* @param clvEinstellungPersonB
* @author Joël
*/
public void fuehreGespraech(char clvEinstellungPersonA, char clvEinstellungPersonB){
int ilvZufallsZahl = genZz(2);
char clvPuffer;
switch(ilvZufallsZahl){
case 0:
clvPuffer = clvEinstellungPersonA;
clvEinstellungPersonA = clvEinstellungPersonB;
clvEinstellungPersonB=clvPuffer;
//System.out.println("Testgespräch A");
break;
case 1:
clvPuffer=clvEinstellungPersonB;
clvEinstellungPersonB=clvEinstellungPersonA;
clvEinstellungPersonA=clvPuffer;
//System.out.println("Testgespräch B");
break;
default:
System.out.println("ERROR in fuehreGespraeche");
break;
} // Ende Switch
// Werte abspeichern
this.ilvParteiA=clvEinstellungPersonA;
this.ilvParteiB=clvEinstellungPersonB;
}
/**
* Einer der Nachbarn wird ausgewählt
* anschließend muss dieser noch bekehrt werden
* hierfür schreibe ich eine extra Methode
* Die Daten des gewählten Nachbarn werden in die lokalen Variablen der Klasse geschrieben
* @author Joël
* @param ilvX Position des Dorfbewohners auf der x-Achse
* @param ilvY Position des Dorfbewohners auf der y-Achse
*
*/
public void waehleNachbar(int ilvX, int ilvY){
int ilvZufallsZahl = genZz(4);
// Randfälle abfangen:
// aus links mach rechts
if (ilvX ==0 && ilvZufallsZahl ==3){
ilvZufallsZahl=2;
System.out.println("aus links mach rechts");
}
// aus rechts mach links
else if(ilvX==19&&ilvZufallsZahl==2){
ilvZufallsZahl=3;
System.out.println("aus rechts mach links");
}
// Wenn Keine Änderungen nötig sind, wird einfach das übergebene intern eingespeichert
switch(ilvZufallsZahl){
case 2:
// rechts
this.ilvXNachbar=ilvX+1;
break;
case 3:
// links
this.ilvXNachbar=ilvX-1;
break;
default:
this.ilvXNachbar=ilvX;
break;
} // rechts und links Switch
//Randfälle abfangen
// aus oben mach unten
if (ilvY ==0 && ilvZufallsZahl ==1){
ilvZufallsZahl=0;
System.out.println("aus oben mach unten");
}
// aus unten mach oben
else if(ilvY==19&&ilvZufallsZahl==1){
ilvZufallsZahl=0;
System.out.println("aus unten mach oben");
}
// Wenn Keine Änderungen nötig sind, wird das übergebene intern eingespeichert
switch (ilvZufallsZahl){
case 0:
// oben
this.ilvYNachbar=ilvY+1;
break;
case 1:
// unten
this.ilvYNachbar=ilvY-1;
break;
default:
this.ilvYNachbar=ilvY;
break;
}// oben und unten Switch
} // Ende Metode
/**
* @deprecated
* @param ilvPosX
* @param ilvPosY
*/
public void auswaehlenNachbar(int ilvX, int ilvY){
// HIER IST IRGENDWO EIN FEHLER
//TODO: Fehler bei den Randabfragen!
int ilvZufallsZahl = genZz(4);
// Wenn Keine Änderungen nötig sind, wird einfach das übergebene intern eingespeichert
switch(ilvZufallsZahl){
case 2:
// rechts
this.ilvXNachbar=ilvX+1;
break;
case 3:
// links
this.ilvXNachbar=ilvX-1;
break;
default:
this.ilvXNachbar=ilvX;
break;
} // rechts und links Switch
// Wenn Keine Änderungen nötig sind, wird das übergebene intern eingespeichert
switch (ilvZufallsZahl){
case 0:
// oben
this.ilvYNachbar=ilvY+1;
break;
case 1:
// unten
this.ilvYNachbar=ilvY-1;
break;
default:
this.ilvYNachbar=ilvY;
break;
}// oben und unten Switch
}
/**
* Nothing
* Entscheidet wer wen bekehrt
* @deprecated
* @author Joël
*/
public void bekehrung(){
}
/**
*@author Joël
* @param laenge Übergibt die Grenze, für die zufällig erstellten Zahlen
* @return Zufallszahl
*/
public int genZz(int laenge){
Random iloZahlenMaschine = new Random();
int ilvZahl = iloZahlenMaschine.nextInt(laenge); // Mind. 0 Max laenge (Array beginnt bei 0 an zu zählen)
// Überprüfungscode:
// System.out.println("LÄNGE: " + laenge);
// System.out.println("Meine Zufallszahl: "+zahl);
return ilvZahl; // übergibt zufällig generierte Zahl
}
/**
* Setzt das gesamte Array auf die Startwerte zurück
* Im einfachen Fall: Eine zufällige Mischung aus schwarz und rot
* @author Joël
* @param ar
* @return Gibt das Array mit den neuen Werten zurück
*/
public char[][] resetArray(char[][]ar){ //@param: setzt Array auf Startwerte zurück; noch nicht fertig!
for (int y=0; y<20;y++){
for(int x=0;x<20;x++){
ar[y][x]=zufaelligeGesinnungEinfach();
}// Ende for-Schleife x
}// Ende for-Schleife y
return ar;
}
/**
* Das Array wird mit den politischen Einstellungen befüllt
* Einfach: schwart oder rot
* @author Joël
* @return gibt das Array mit neuen Werten zurück
*/
public char zufaelligeGesinnungEinfach(){ //@param: gibt zufällige Gesinnung zurück, schwarz oder rot
int ilvWelchePartei=genZz(2);
char clvRueckgabe ='?';
switch(ilvWelchePartei){
case 0:
clvRueckgabe='s';
break;
case 1:
clvRueckgabe='r';
break;
default:
System.out.println("ERROR in zuefaelligeGesinnungEinfach!");
}//Ende-switch
//Testcode
//System.out.println(ilvWelchePartei);
//System.out.println(clvRueckgabe);
//@param
//soll s oder r zurück geben
return clvRueckgabe;
}
/**
* Das Array wird mit den politischen Einstellungen befüllt
* Komplex: schwarz, rot, grün, gelb
* @author Joël
* @return gibt das Array mit neuen Werten zurück
*/
public char zufaelligeGesinnungKomplex(){ //@param: gibt zufällige Gesinnung zurück, schwarz oder rot
int ilvWelchePartei=genZz(2);
char clvRueckgabe ='?';
switch(ilvWelchePartei){
case 0:
clvRueckgabe='s';
break;
case 1:
clvRueckgabe='r';
break;
default:
System.out.println("ERROR in zuefaelligeGesinnungEinfach!");
}//Ende-switch
//Testcode
//System.out.println(ilvWelchePartei);
//System.out.println(clvRueckgabe);
//@param
//soll s oder r zurück geben
return clvRueckgabe;
}
/**
* Gibt den kompletten Inhalt des Arrays in der Console aus
* @author Joël
* @param ar
*/
public void checkArray(char[][] ar){
int ilvDurchlaufzahl=0;
for (int y=0; y<20;y++){
for(int x=0;x<20;x++){
ilvDurchlaufzahl++;
System.out.println(ilvDurchlaufzahl+"<>"+ar[y][x]);
}// Ende for-Schleife x
}// Ende for-Schleife y
}
/**
* Zählt den gesuchten Wert im Array
* @param ar übergebenes Array
* @param clvSuche
* @return gibt die ermittelte Anzahl durch
*/
public int zaehleArrayEinfach(char[][] ar, char clvSuche){
int count=0;
for (int y=0; y<20;y++){
for (int x=0; x<20;x++){
if(ar[x][y]==clvSuche){
count ++;
}
}
}
return count;
}
}
Ausgabe:
(...)
Schleifendurchlauf: 40000
Schwarz: 217
Rot: 183
Wobei (...) für die Wahrscheinlichkeitsrechnungen stehen soll.
Ich bin für jede Hilfe dankbar!
Gruß
Fasko
PS: Später will ich das Programm noch so erweitern, dass ich mit mehr als nur zwei Parteien starte.