Java Zahl erraten Methode?
Ich versuche gerade eine Methode zu schreiben bei der der Computer die Zahl d erraten muss es kommen jedoch immer nur Zahlen die ungefähr d entsprechen heraus und ich finde den Fehler nicht Ich hoffe jemand kann mir helfen.
a ist die untere Grenze des Ratebereichs und b die obere.
public class raten{
int d = 11;
public int raten(int a, int b){
int c = (int) (Math.random()*b+a);
if(c < d){
return raten(c,b);
}
else if(c > d){
return raten(a,c);
}
else{
return a;
}
}
}
4 Antworten
Naja, du gibst ja auch die Variable "a" zurück, obwohl du "c" und "d" vergleichst. und wenn die beiden gleich sind ist "a" nicht unbedingt "c"...
Außerdem erschließt sich mir nicht wie der Computer hier etwas "erraten" soll, schließlich kommt er ja mit dieser Methode immer irgendwann auf das Ergebnis
Ja danke, ich kann programmieren. Das ändert nichts an der Tatsache dass du "c" und "d" miteinander vergleichst, nur im im letzten else dann "a" zurück zu geben. Aber "a" wird von dir niemals angeguckt. Was erwartest du denn als Ausgabe? Dass das Ergebnis der Methode am Ende die Zahl "d" ist? Wie soll denn das funktionieren wenn du "a" niemals mit irgendwas vergleichst... Der ganze Algorithmus ergibt so keinen Sinn
Ich muss a und b ja mit nichts vergleichen, es ist ja nur der Bereich in dem die Zahlen vorkommen können und wenn die geratene Zahl größer ist als die tatsächliche bedeutet das ja, dass nur noch Zahlen überprüft werden müssen, die kleiner als die geratene Zahl sind weshalb ich a bzw b dann den Wert der geratenen Zahl zuweise je nachdem ob diese größer oder kleiner als d war.
Ich hoffe der Ansatz ist verständlich.
Aber warum gibst du dann "a" zurück? "a" ist doch nicht zwangsläufig "c" wenn "c" "d" entspricht. wenn du zB raten(5,8) einträgst, und beim ersten mal ist "c" zufälligerweise direkt gleich "d", liefert die Methode trotzdem den Wert von "a" zurück, der ja 5 ist. Du hast einen absoluten Gedanken-Dreher...
ja ich returne jetzt c jetzt funktioniert es wie ich es mir vorgestellt habe
So, da du meine andere Antwort nicht verstanden hast, habe ich dir dein Programm mit der Raten Methode so geschrieben, wie ich's machen würde.
Man beachte, ich habe für die Variablen keine einzelnen Buchstaben verwendet, sondern aussagekräftige Namen, so kann es auch zu keinen Verwechslungen kommen. Bitte verinnerliche dies bei deinen Programmen. Außerdem, schreibe Kommentare bzw. JavaDocs zu deinen Methoden
public class Raten {
public static int versuche = 0;
public static int gesuchteZahl = 13;
public static void main(String[] args) {
raten(0, 1000);
System.out.println("Der Computer hat " + versuche + " versuche gebraucht, um die Zahl zu erraten.");
}
/**
*
* @param minZahl Die untere Grenze der gesuchten Zahlen
* @param maxZahl Die obere Grenze der gesuchten Zahlen
* @return die geratene Zahl
*/
public static int raten(int minZahl, int maxZahl){
versuche++;
Random random = new Random();
int gerateneZahl = random.nextInt(maxZahl - minZahl + 1) + minZahl;
if(gerateneZahl < gesuchteZahl){
return raten(gerateneZahl, maxZahl);
} else if(gerateneZahl > gesuchteZahl){
return raten(minZahl, gerateneZahl);
} else {
return gerateneZahl;
}
}
}
Der Computer hat 20 versuche gebraucht, um die Zahl zu erraten.

Du kommst viel effizienter ans Ziel, wenn du mit einer for Schleife arbeitest. Da gibt es jede Zahl nur einmal. Hat zwar genausowenig Sinn wie das aktuelle, geht aber deutlich schneller und sparender im Durchschnitt (besonders bei etwas größeren Zahlen).
Na was willst du denn damit erreichen? Das hat doch praktisch betrachtet keinen Sinn, wenn du schon weisst wonach du überhaupt suchst. Naja, wie auch immer, die Variante mit for ist durchschnittlich effizienter.
Kann zum Beispiel Hilfreich für Wurzelberechnung nach dem Heron-Verfahren sein.
Versuchs mal mit Math.random().nextInt()
https://stackoverflow.com/a/8913481/5759837
oder
Steht bei Stackoverflow in den Antworten, wie du das verwendest.
Hier noch ein Beispiel: https://stackoverflow.com/a/20389923/5759837
-.-
int c = random.nextInt(max - min + 1) + min;
was ist daran denn so schwer mensch :-(
Der Fehler war, dass ich a statt c returnt habe aber trotzdem Danke
ein = setzt einen Wert zwei = vergleichen zwei werte ...