Die Frage ist von mir, Coburg. Ich glaube, hier greift die 37%-Brötchen-Regel.
Nach der Zeichnung sieht es so aus, als wenn bei einer Fläche von 10 oder 15 (Feldern) Wasser maximal 8 oder 12 (Felder) tief eindringt, daher / 5 und * 4 — unabhängig von den anderen (benachbarten) Feldern.
Wenn dem so ist, will man natürlich, dass bei beliebiger Länge die jeweils maximale Tiefe mit gleichbleibender Whrs. erreicht wird.
Damit kommt man irgendwie zu der Formel. Aber Tiefe ist hier relativ, nicht absolut, deshalb muss die Whrs. ja geringer werden, aber gg 0 finde ich auch falsch.
@TO: Such mal nach der normalen Konsolenzeilenlänge Linux. Monospace (Zeichen) und so, mehr nachher.
Nettes Einstiegsprogramm. Habs jetzt mal testweise implementiert, mit der Ausgabe auf stdout.
Ich habe es aber jetzt so verstanden.
Sobald es regnet, steht die erste Reihe unter Wasser. Jetzt wird sukzessiv geprüft ob das Feld nass wird. Das geschieht anhand der Wahrscheinlichkeit. Ein Feld kann nur nass werden, wenn das Feld darüber ebenfalls nass ist.
Ich habe es praktisch so gelöst, dass ich Durchläufe gemacht habe und dabei von unten nach oben gegangen bin und zwar je Spalte. Damit wollte ich vermeiden, dass innerhalb eines Durchlaufs das Wasser komplett durchsickern kann.
Ich hab es gestern auch mal programmiert spaßeshalber.
Allerdings hab ich “oben” generell alle Felder geflutet. Sieht dann so aus:
w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w
w . w w w w . . . . . . . w . . w w w w . . . w . w . . . w w . w . w w . . . . w w . . . . w . w . w . w w . w . . . w . w w . w . . w w w w w w w . w . w w .
. . w . w . . . . . . . . . . . . w w w . . . . . w . . . w . . w . w w . . . . w w . . . . w . w . w . . . . w . . . w . w w . . . . . . . w w . . . . . w w .
. . . . w . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . w w . . . . w . w . . . . . . w . . . . . . . . . . . . . . w . . . . . . . w .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . w w . . . . w . . . . . . . . w . . . . . . . . . . . . . . w . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . w . . . . . . . . . . . . . . w . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . . . . . .
Bei mir wird es wie bei dir Zeile für Zeile von oben nach unten durchgegangen.
Bei Hausaufgaben wird hier niemand einfach seine Lösung präsentieren (ich weiß, du hast nicht darum gebeten). Am besten sagst du einfach, wo deine Probleme liegen. Ich hab das ganze mit nur zwei Klassen realisiert:
Square
stellt ein Stück Rasen/Erdreich dar
weiß ob es nass ist
enthält eine Wahrscheinlichkeit dafür, nass zu werden, wenn das Feld darüber nass wird
hat eine Methode, die ausgibt, ob es nass ist
hat eine Methode, die aufgerufen wird, wenn das Square darüber nass ist und abhängig von obiger Wahrscheinlichkeit auswürfelt, ob es ebenfalls durchfeuchtet wird
hat eine Methode, die einen char zurückgibt: w für durchnässt, . für trocken.
Rain
enthält die Mainmethode, die ein Objekt vom Typ Rain erzeugt und diesem die Maße des betrachteten Querschnitts mitgibt (Anzahl Zeile und Anzahl Spalten) und dann eine Methode aufruft, die die Durchfeuchtung simuliert.
enthält das “Spielfeld”, also den Querschnitt, ein Array new Square[columns][rows]
initialisiert die oberste Zeile nass, die anderen trocken
bearbeitet dann ab Zeile 2 (Index 1) Zeile um Zeile und ruft, falls das Square darüber nass ist, die passende Methode im Square auf, die für die Durchfeuchtung (oder auch nicht) sorgt.
hat eine Methode, die das Spielfeld mithilfe der in Square vorhandenen Methode, die w für durchnässt, . für trocken zurückgibt, darstellt.
Man kann das auch alles ganz anders lösen. Dies ist sicher nicht unbedingt der beste, aber ein möglicher Weg. Ich hoffe, das war nun nicht zu viel Hilfe. Frage einfach nach bei konkreten Problemen, zeige deinen vorhandenen Code und erkläre, was fehlt / nicht klappt und was du so versucht hast.
in meinem Ersten post habe ich folgenden Code gepostet
public class Regen {
static Scanner sc;
public static boolean wahrscheinlichkeit(int a, int b) {
if(Math.random() < 0.5)
return true;
else
return false;
}
public static void main(String[] args) {
sc = new Scanner(System.in);
System.out.println("Bitte Abmaße des zu betrachtenden Querschnitts eingeben");
int m = sc.nextInt();
int n = sc.nextInt();
sc.close();
}
}
Ist das schonmal ok für den Anfang wegen dem Querschnitt des Rasens?
Habt das eigentlich schon gelöscht gehabt weil sich keine zu geäußert hat^^ aber vielleicht ist es ja doch ok^^
Den Scanner sc benutzt du nur in Main, warum definierst du ihn dann nicht auch dort?
Die Methode wahrscheinlichkeit wird nicht verwendet.
Du machst alles statisch: Keine gute Idee. Statisch sollte nur werden, wenn du genau weißt, was du tust. Am Anfang abgesehen von main erstmal gar nichts, bis du dich mit OOP besser auskennst.
Deine Man fragt nur zwei Werte ab. Das ist sicher richtig, um die Aufgabe später wortgetreu zu erfüllen. Der Teil ist aber recht irrelevant. Meine main-Methode sieht schlicht so aus:
Rain rain = new Rain(80, 7);
rain.simulate();
}
Alles an der Aufgabe inhaltlich interessante behandelst du darin gar nicht. Also kann ich zur Frage “Ist das schonmal ok für den Anfang wegen dem Querschnitt des Rasens?” nur “nein” antworten, da darin nichts zum Querschnitt zu sehen ist.
Die Methode wahrscheinlichkeit ist aber ausbaufähig. So wie sie da steht, macht sie keinen Sinn. Du musst prüfen, ob ein Ereignis eintritt, abhängig vom übergebenen Rechteck. Man kann z.B. innerhalb eines Wertebereichs bleiben von 1-100. Hat das Feld eine Wahrschienlichkeit von 35 (also 35%), tritt das Ereignis nur ein, wenn Math.Random kleiner ist.
Zum testen, lass den Scanner weg. Das eintippen von Zahlen dauert viel zu lange.
Edit: SORRY, war wohl etwas langsam beim Schreiben, die vorherigen Posts waren noch nicht da
Also da bist du aber auch ein bisschen selber schuld, du hast gefragt wie du weiter vorgehen sollst und da gab es
schon eine Menge Hinweise.
Wenn du natürlich 2 Tage nichts machst…
Dein Programm macht bisher eigntl. fast nichts.
Du liest zwei Ints ein (bete, dass da keiner was anderes eintippt) machst aber letztlich nichts damit.
Deine Methode wahrscheinlichkeit(int a, int b) bekommt zwei Parameter übergeben, mit denen
ebenfalls genau nichts passiert.
Bisher sehe ich das in 12h definitiv nicht fertig werden. Wie sieht es mit den Hinweisen in Beitrag #5#7 aus, vor allem auch #18/#20.
Also eigentlich solltest du schon mehr drin stehen haben.
Was soll man dazu sagen. Außer einer einfachen Wahrscheinlichkeitsrechnung (welche nie irgendwo angewendet wird) hast du da ja noch überhaupt nichts gemacht. Versuche doch mal das Umzusetzen, was man dir hier mitgegeben hat.
Ich hab hier jetzt nicht alles gelesen und kann sein, dass ich das ein oder andere wiederhole aber:
Mach es Schritt für Schritt. Überlege dir was du speichern willst und wie du es speichern kannst. Da das Thema Arrays sind, ist ja klar welche Struktur du nutzen sollst. Mit einem 2D-Array kannst du ja auch wunderbar einen Boden mit X- und Y-Koordinaten darstellen. Mit einer Schleife gehst du da durch und manipulierst die Zustände. Deine Wahrscheinlichkeitsrechnung kannst du ja durchaus nutzen (wobei hier die Parameter a und b unnötig sind und die Namensgebung auch nichtssagend ist). Fang halt mal an was zu machen und wir schauen dann drüber.
Wie weit bist du mit der Aufgabe? Wann ist Abgabe? Ich hab mir jetzt noch mal die Aufgabenstellung durchgelesen, das kann schon ziemlich einfach auf 5 verschiedene gelöst werden. Die Wahrscheinlichkeit für eine lange Spalte (lang muss definiert werden) kommt auch auf die Ziellänge ab. Wie lang soll eine Zeile sein?
*** Edit ***
Ich hab dir das mal geschrieben, die Aufgabestellung ergibt auf jeden Fall sinn:
[spoiler]```public class Wasser {
public static void wasserAusgeben(int rows) {
double d = 0.5;
int i = 0;
while (Math.pow(1 - d, rows) < 0.1) {
d *= 0.5;
i++;
}
System.out.println("~ Tiefe (>=90%): " + i);
boolean[] bools = new boolean[rows];
for (int j = 0; j < bools.length; j++) {
bools[j] = true;
}
while (!allesFalse(bools)) {
for (int j = 0; j < rows; j++) {
if (bools[j]) {
if (Math.random() < 0.5) {
System.out.print("w");
} else {
bools[j] = false;
System.out.print(".");
}
} else {
System.out.print(".");
}
}
System.out.println("");
}
}
private static boolean allesFalse(boolean[] bools) {
for (boolean bool : bools) {
if (bool) {
return false;
}
}
return true;
}
public static void main(String[] args) {
wasserAusgeben(2000);
}
Es wird berechnet, wie tief Wasser mit einer Wahrscheinlichkeit von >= 90 % eindringt. Meine Rechnung ist dabei pessimistisch. D. h. mit einer Wahrscheinlichkeit von >= 50 % dringt Wasser 0 Zeilen tief ein. Die erste Zeile ist bei mir nicht einfach getutet.
Wenn du willst, kannst du das verwenden, dann würde ich selber aber noch ein paar Sachen vereinfachen.
Ich kenne das ja (selber), wenn man den Ansatz gar nicht hinbekommt, das ist dann shit. :twisted: Daher ist man auf Hilfe angewiesen.
Also Abgabe ist um 00:00 Uhr…
Das ist echt hart wenn man keinen Ansatz richtig hinbekommt, ich bin allen hier echt dankbar für die Hilfe. Trotz allem fällt es mir schwer es zu programmieren, teilweise kenn ich die Befehle nichtmal^^
Danke dir für den Code… werde mich mal mit dem Vertraut machen… gibt noch einige Befehle da die ich nicht kenne und ausführen will er auch nicht auf anhiebt bei mir… hab ja noch zeit^^
Also bis 23:59 Uhr (00:00 Uhr) hast du Zeit, dann schlafe ich schon mit meiner Schnupfen.^^ Elektronische Abgabe (mit timestamp) kenne ich eigentlich nur von der Hochschule.
Du musst noch ein bisschen was an deiner Ausdrucksweise pfeilen. Befehle sind das nicht, sondern Anweisungen und Methodenaufrufe (oop). Es muss nix importiert werden (der Klasse bekannt). Math.random() liefert einen zufälligen double-Wert zwischen [0,1) zurück (gleichverteilt), 1 ist nicht enthalten, 0.99 aber schon. < 0.5 ist wie ein Münzwurf.
So, jetzt willst du das Ganze starten, Java (7) installieren (jdk und jre/jvm), Systemvariable eintragen:
cmd.exe
cd Desktop
java -version
javac -version
javac Wasser.java (Datei muss so heißen wie die Klasse)
java (-jar) Wasser
Ausgabe usw.
Sag mal, ob das geklappt hat. Wenn unsere Versionen auch noch physikalisch korrekt sind (bei ner bestimmten Fläche), dann wäre ich schon baff. Aber whrs. hängt das von G ab, Eigenschaften von Wasser und Bodenbeschaffenheit, oder? Wieso hat ein Tropfen immer eine bestimmte Größe und milli-ml und so, oder?!
Es gibt eigentlich nur 2 Kriterien bei der Bewertung, eigentlich sollte sie schnell sein.
Ist
int i = 0;
while (Math.pow(1 - d, rows) <= 0.5) {
d *= 0.5;
i++;
}
System.out.println("~ Tiefe (>=50%): " + i);```
für die erwartete Tiefe (wenn rows die Anzahl der Spalten/Rechtecke / Länge ist) richtig? So gut sind meine Statistik kenntnisse dann doch nicht.