Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Computer zahlen raten beibringen (https://www.delphipraxis.net/91109-computer-zahlen-raten-beibringen.html)

Newbie44 29. Apr 2007 18:01


Computer zahlen raten beibringen
 
Hallo,

ich möchte einen algorithmus schreiben, mit dem der computer zahlen erraten soll. und zwar nicht irgendwie, mit so wenig versuchen wie möglich.

der benutzer gibt eine variable ein. der computer soll eine zufallszahl generieren (soweit bin ich schon längst), und dann so schnell es geht die zahl rausfinden.

wie sollte ich diesen algo schreiben?

wie bringe ich dem computer bei, dass er so wenig versuche wie möglich dafür braucht? und wie setze ich das programm technisch um?

ich hatte erst an Rekursion gedacht, also sprich das der computer eine funktion aufruft, dort die zufällig gezogene zahl mit der von der benutzer eingegebenen zahl vergleich und die funktion dann einen jeweiligen rückgabewert liefert, ob die zahl nun größer sein muss, kleiner sein muss oder direkt die richtige war.

mein problem hier ist nun, wie mach ich das mit den versuchen? der computer kann ja nicht zu seiner zufallszahl immer nur 1 addieren, er muss schon irgendwie wie ein mensch denken.

Für eure Hilfe wäre ich euch sehr dankbar.

Gruß

Sebastian

mkinzler 29. Apr 2007 18:02

Re: Computer zahlen raten beibringen
 
Man kann aber den Wertebereich für die Zufallszahl festlegen.

BenjaminH 29. Apr 2007 18:07

Re: Computer zahlen raten beibringen
 
Er kann ja nach dem Intervallhalbierungsverfahren vorgehen.
D.h. es muss ein Intervall geben, in dem die Zufallszahl liegt. z.B. 0-1000
Delphi-Quellcode:
IntervalHigh := 1000;
IntervalLow := 500;
Dann nimmt er die Zahl in der Mitte
Delphi-Quellcode:
Geraten:=Trunc((IntervalHigh-IntervalLow)/2);
Jetzt testet er auf kleiner oder größer und setzt die Oberbzw. untergrenze neu.
Delphi-Quellcode:
if zugroß then
  IntervalHigh:=Geraten
else if zuklein then
  IntervalLow:=Geraten;
Dann fängst du wieder oben an(also bei Geraten:=)
Ich würde keine Rekursion verwenden, ich sehe da an dieser Stelle keinen Vorteil drin.

Newbie44 29. Apr 2007 18:12

Re: Computer zahlen raten beibringen
 
vielen dank für eure antworten, ja ich hatte auch schon an so eine begrenzung gedacht, das würde es wirklich einfacher machen. auch ist die idee mit unter und obergrenze gut. das könnte ich auch gut in meine iteration bzw rekursion einbauen.

wenn ich als mensch zahlen rate, dann gebe ich erstmal auch eine zahl ein die in dem eingegebenen intervall liegt. wenn meine zahl zu groß ist schaue ich erst ob sie sehr viel größer bzw nur etwas größer ist

wenn die zahl die ich erraten soll z. B. 300 ist, und das intervall zwischen 0 und 500 ist, dann wähle ich so meistens etwas aus der mitte, also sprich ca. 200 - 270.

die zahl wäre aber in beiden fällen zu klein, also denke ich, es könnte 350 sein, die zahl wäre dann zu groß, somit weis ich die zahl liegt zwischen 250 und 350, dann könnte ich weiter probieren, aber nur in diesem intervall.

ja es stimmt so könnte es gehen.

Hat hier jemand noch eine ausgefuchstere bzw bessere idee?

vielen dank euch allen

mkinzler 29. Apr 2007 18:14

Re: Computer zahlen raten beibringen
 
Das ist ja mit dem Intervallhalbierungsverfahren gemeint. Auch die binäre Suche bei Binärbäumen basiert auf diesem Prinzip.

dominikkv 29. Apr 2007 18:19

Re: Computer zahlen raten beibringen
 
Mal ein Versuch:

Delphi-Quellcode:
var
   Obergrenze, Untergrenze, Zahl, I: Integer;

  //...

  repeat
    I := Random(Obergrenze - Untergrenze) + Untergrenze;
    if I > Zahl then
      Obergrenze := I
      else
      if I < Zahl then
        Untergrenze := I
      else
      Break;
  until false;

  showmessage('Zahl gefunden: ' + IntToStr(I));

Newbie44 29. Apr 2007 18:30

Re: Computer zahlen raten beibringen
 
jupp so gehts, hab ich gerade probiert, ich hatte es ja schon fast, nur das mit der untergrenze hatte vorhin nicht so geklappt,

damit wäre das problem gelöst

vielen dank für alle antworten


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz