AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zufallszahlen, wer kann helfen?

Offene Frage von "kunta"
Ein Thema von kunta · begonnen am 14. Nov 2009 · letzter Beitrag vom 17. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
kunta

Registriert seit: 14. Nov 2009
Ort: Aachen
7 Beiträge
 
#1

Zufallszahlen, wer kann helfen?

  Alt 14. Nov 2009, 07:44
In einem Experiment sollen die Zahlen von 1-16 (in genau dieser Reihenfolge) mittels eines Zufallgenerators erzeugt werden.
Es gibt insgesamt 16 Durchläufe. Im i-ten Durchlauf wird so lange eine Zufallszahl erzeugt, bis man die Zahl i erhält. Ein solcher Durchlaufwird per ButtonClick auf "Zufall berechnen"gestartet. Die dazu notwendige Anzahl der Versuche soll in ein Stringgrid der Größe 4x4 eingetragen werden. In einem zweiten Stringgrid (ebenfalls Größe 4x4) wird die Zahl i dargestellt.
Benutzt werden soll: randomize, random

Ich habe es selbst versucht aber da ich erst ein paar Tage damit zu tun habe komme ich nicht weiter. Wer kann mir helfen?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
 var Versuche,Zufall :integer;

Begin
Versuche:=0;
  repeat

    inc(Versuche);
    Zufall := random(16) + 1; // mindestens die Zahlen von 1-20, oder was meint Ihrt? Wie stellt man bis "unendlich" ein?
  until Zufall = 1;
  Stringgrid2.Cells[0,0]:=inttostr(Versuche);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;
  Zufall:=random(16) + 1;
  Versuche := 0;
end;

procedure TForm1.StringGrid1Click(Sender: TObject);
begin
  Stringgrid1.Cells[0,0]:='1';
  Stringgrid1.Cells[1,0]:='2';
  Stringgrid1.Cells[2,0]:='3';
  Stringgrid1.Cells[3,0]:='4';
  Stringgrid1.Cells[0,1]:='5';
  Stringgrid1.Cells[1,1]:='6';
  Stringgrid1.Cells[2,1]:='7';
  Stringgrid1.Cells[3,1]:='8';
  Stringgrid1.Cells[0,2]:='9';
  Stringgrid1.Cells[1,2]:='10';
  Stringgrid1.Cells[2,2]:='11';
  Stringgrid1.Cells[3,2]:='12';
  Stringgrid1.Cells[0,3]:='13';
  Stringgrid1.Cells[1,3]:='14';
  Stringgrid1.Cells[2,3]:='15';
  Stringgrid1.Cells[3,3]:='16';
end;

end.
[edit=alzaimar] Delphi-Tags eingefügt, Code ausgerichtet. Mfg, alzaimar[/edit]
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Zufallszahlen, wer kann helfen?

  Alt 14. Nov 2009, 08:03
Der Code, um die Anzahl der Versuche für die Zahl '1' ist doch schon recht brauchbar. Es fehlt nur vor der Schleife die Vorbelegung der Variablen 'Versuche' mit einem sinnvollen Anfangswert.

Du hast auch ganz richtig erkannt, das die Vorschrift "Berechnung einer Zufallszahl" auch einen Bereich beinhalten soll ("Berechnung einer Zufallszahl im Bereich 1..20"). Denn so müsste man wirklich davon ausgehen, das der Lehrer(?) irgendeine Zufallszahl will. Und dann kann man sich einen Wolf zählen, bis die richtige Zahl kommt. Ich denke, er meint Zufallszahlen im Bereich 1..16 .

Überlege Dir dann, was Du hast: Du kannst die Anzahl der Versuche zählen, die man benötigt. bis eine Zufallszahl im Bereich 1-16 genau 1 ergibt.
Das könnte man verwenden, um die Anzahl der Versuche zählen, die man benötigt. bis eine Zufallszahl im Bereich 1-16 genau I ergibt, wobei I zwischen 1 und 16 ist.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
kunta

Registriert seit: 14. Nov 2009
Ort: Aachen
7 Beiträge
 
#3

Re: Zufallszahlen, wer kann helfen?

  Alt 14. Nov 2009, 08:21
Hallo,
vielen Dank für die Antwort.
Ich habe nun
Vesuche:=0;
vor die Schleife gesetzt.
Vorher hatte ich den Eindruck, dass alle Versuche zusammen addiert wurden. Jetzt kommt jedesmal eine neue Zahl zwischen 1 und 16.
Und nun?
Ich denke, dass ich alles für die "1" habe und muss zu der 2. Ziffer (Stringgrid1.Cell[1,0]) der 2 kommen.
Nur wie? Und wie kann ich die Schleife verwenden?
  Mit Zitat antworten Zitat
Benutzerbild von TOC
TOC

Registriert seit: 5. Jan 2005
Ort: Trier
248 Beiträge
 
Delphi 7 Personal
 
#4

Re: Zufallszahlen, wer kann helfen?

  Alt 14. Nov 2009, 08:22
Hi!

Wie wäre es zum Beispiel mit so einer Funktion hier:

Delphi-Quellcode:
{

  Number    = Gesuchte Zahl
  RangeFrom = Untere Bereichsgrenze (einschließlich)
  RangeTo  = Obere Bereichsgrenze  (einschließlich)

  Ergebnis:
  Result = Anzahl der Versuche die Benötigt wurden
          oder
          -1 falls die angegebene gesuchte Zahl außerhalb des Bereiches liegt
}

Function GetRandomNumber(Number, RangeFrom, RangeTo: Integer): Integer;
Var
  RandNum, Range: Integer;
Begin
  // Vergleichen ob gesuchte Zahl innerhalb des Bereiches liegt,
  // um Endlosschleife zu vermeiden
  If (Number<RangeFrom) or (Number>RangeTo)
  Then Result:=-1
  Else Begin
    // Ergebnis erstmal auf 0 setzen
    Result:=0;
    // Bereich voausberechnen for Random
    Range:=RangeTo-RangeFrom+1;
    // Wiederhole...
    Repeat
      // Erzeuge eine Zufallszahl innerhalb von RangeFrom, RangeTo (einschließlich)
      RandNum:=Random(Range)+RangeFrom;
      // Anzahl versuche Erhöhen
      Inc(Result);
    // ...solange bis gesuchte Zufallszahl erzeugt wurde
    Until RandNum=Number;
  End;
End;
Also,dieser Funktion muss Du als Eingabeparameter "Number" geben, das ist dann die gesuchte Zahl, und den Bereich. In Deinem Beispiel also 1 für RangeFrom und 16 for RangeTo. Die Funktion erzeugt dann innerhalb einer Schleife solange eine Zufallszahl innerhalb des Bereiches bis der Wert von "Number" gefunden wurde. Und als Ergebnis hast Du dann die Anzahl der Versuche.

Aufrufen kannst Du diese Funktion dann so zum Beispiel:

StringGrid2.Cells[0,0]:=IntToStr(GetRandomNumber(1, 1, 16)); Und dann würde ich Dir eine Schleife empfehlen für die erste 1, also "Number", und in dieser Schleife von 1 bis 16 laufen.

Grüße von TOC!
Lars Uwe Hohmann
"Wäre die Erde eine Bank, ihr hättet sie längst gerettet!"
(Zitat GreenPeace)
  Mit Zitat antworten Zitat
14. Nov 2009, 09:06
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage
kunta

Registriert seit: 14. Nov 2009
Ort: Aachen
7 Beiträge
 
#6

Re: Zufallszahlen, wer kann helfen?

  Alt 14. Nov 2009, 10:35
Leider klappt es noch nicht.
Wie kann ich denn ein Programm schreiben, sodass für alle 16 Zahlen in der Reihenfolge die Zufallszahl gesucht wird und dann noch im Stringgrid2 ausgegeben wird?
Wie kann man es so einstellen, dass im Stringgrid1 - Feld die Zahlen 1-16 erst dann gezeigt werden wenn man sie anklickt. Also einzeln nacheinander.
  Mit Zitat antworten Zitat
Benutzerbild von TOC
TOC

Registriert seit: 5. Jan 2005
Ort: Trier
248 Beiträge
 
Delphi 7 Personal
 
#7

Re: Zufallszahlen, wer kann helfen?

  Alt 14. Nov 2009, 11:53
Hi!

Zitat von kunta:
Leider klappt es noch nicht.
Das Leben ist ja auch noch nit zuende und der Tag noch lang!

Zitat von kunta:
  Zufall := random(16) + 1; // mindestens die Zahlen von 1-20, oder was meint Ihrt? Wie stellt man bis "unendlich" ein?
Du KANNST gar keine unendliche Zuffalszahl mit Random(N) erzeugen, weil "Random(N: Integer)" immer eine ENDLICH große Integer-Zahl erzeugt. Eine Integer Zahl ist (Bei Delphi3) immer:

Zitat von Die Delphi-Hilfe:
Beschreibung:
Random gibt eine Zufallszahl im Bereich 0 <= X < Range zurück.

Delphi-Quellcode:
  Typ Wertebereich     Format
Integer -2147483648..2147483647   32 Bit einschließlich Vorzeichen
Also, ne größere Zufallszahl als 2147483646 wirst Du von Random(N) (D3) nie geliefert bekommen können!
Und selbst wenn der Integer-Bereich bei moderneren Delphis vielleicht größer sein mag: ENDLICH ist eine Integer-Zahl (die im Grunde nur aus einer bestimmten Anzahl von Bytes besteht) eigentlich IMMER.

Zitat von kunta:
Wie kann ich denn ein Programm schreiben, sodass für alle 16 Zahlen in der Reihenfolge die Zufallszahl gesucht wird und dann noch im Stringgrid2 ausgegeben wird?

Wie kann man es so einstellen, dass im Stringgrid1 - Feld die Zahlen 1-16 erst dann gezeigt werden wenn man sie anklickt. Also einzeln nacheinander.
Also, mir ist Deine Frage leider noch nicht so ganz klar.

Möchtest Du das in StringGrid1 und StringGrid2 nur leere Felder sind, und dann klickst Du zum Beispiel auf Cell[0, 0] von StringGrid1, er schreibt dann ne 1 da rein und die Anzahl der Versuche die er zum "würfeln" gebraucht hat in StringGrid2?

Oder:

Möchtest Du einen einzigen Button auf denn du klickst, und er berechnet dann in der Reihenfolge zuerst die 1 von Cell[0,0], beim zweiten klick die 2 von Cell[1, 0] usw bis 16 und beide StringGrids sind dann nach 16 Clicks voll?

Also, erkläre uns bitte etwas genauer wie das Programm funktionieren soll. Es macht nämlich vom Programm her einen ziemlich großen Unterschied welche Art von Klick (Ob StringGrid.Click oder Button.Click) Du verwenden willst. Tatsächlich kann man in einem StringGrid ebenfalls einen einfachen Click programmieren, so wie bei einem Button, man kann aber auch auf einen Click reagieren und abfragen WELCHE Zelle angeklickt wurde (was etwas mehr Aufwand ist).

Grüße von TOC!
Lars Uwe Hohmann
"Wäre die Erde eine Bank, ihr hättet sie längst gerettet!"
(Zitat GreenPeace)
  Mit Zitat antworten Zitat
Benutzerbild von TOC
TOC

Registriert seit: 5. Jan 2005
Ort: Trier
248 Beiträge
 
Delphi 7 Personal
 
#8

Re: Zufallszahlen, wer kann helfen?

  Alt 14. Nov 2009, 12:31
Hi!

Du könntest folgendes mal versuchen:

Delphi-Quellcode:
{
  Diese Methode wird aufgerufen wenn eine Zelle in StringGrid1 angecklickt wird.
}

procedure TForm1.StringGrid1SelectCell(Sender: TObject; Col, Row: Integer;
  var CanSelect: Boolean);
Var
  Number: Integer;
begin
  // Berechne aus Col (Spalte) und Row (Zeile) die gesuchte Zahl
  Number:=Row*4+Col+1;
  // Wandle diese Zahl in einen String und schreibe sie in Stringrid1
  StringGrid1.Cells[Col, Row]:=IntToStr(Number);
  // Würfel nun Zufallszahlen bis die Zahl gefunden wurde
  // und schreibe die Anzahl der Versuche in StringGrid 2
  StringGrid2.Cells[Col, Row]:=IntToStr(GetRandomNumber(Number, 1, 16));
end;
Vergesse aber bitte nicht, zum Beispiel in OnFormCreate, den Randomize-Befehl aufzurufen.

Grüße von TOC!
Lars Uwe Hohmann
"Wäre die Erde eine Bank, ihr hättet sie längst gerettet!"
(Zitat GreenPeace)
  Mit Zitat antworten Zitat
kunta

Registriert seit: 14. Nov 2009
Ort: Aachen
7 Beiträge
 
#9

Re: Zufallszahlen, wer kann helfen?

  Alt 17. Nov 2009, 06:10
"Möchtest Du einen einzigen Button auf den du klickst, und er berechnet dann in der Reihenfolge zuerst die 1 von Cell[0,0], beim zweiten klick die 2 von Cell[1, 0] usw bis 16 und beide StringGrids sind dann nach 16 Clicks voll?"


Genau. Diesen Fall möchte ich erreichen.
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#10

Re: Zufallszahlen, wer kann helfen?

  Alt 17. Nov 2009, 07:41
Du hast doch schon eine Schleife, mit der du solange Zufallszahlen ziehst, bis du die gewünschte (in deinem Fall die 1) erhältst.

Jetzt musst du nur noch diese Schleife in einer zweiten Schleife "verpacken", die alle Zahlen von 1 - 16 zieht:

Pseudocode:

Delphi-Quellcode:
for GesuchteZahl := 1 to 16 do begin
  AnzahlVersuche := 0;
  repeat
    ZahlZiehen;
    AnzahlVersuche := AnzahlVersuche + 1;
  until GezogeneZahl = GesuchteZahl;
  AnzahlVersucheInGridEintragen;
  GesuchteZahlInGridEintragen;
end;

Edit: Tschuldigung, die oben aufgezeigte Lösung füllt das Grid natürlich in einem Rutsch. Du möchtest ja Klicken. In diesem Fall benötigts du eine globale Variable GesuchteZahl, die du am Anfang auf 1 setzt (das ist ja die erste Zahl die du suchst) und mit jedem Klick auf den Button ermittelst du nun die Anzahl der Versuche, diese Zahl zu ziehen, Grid füllen, GesuchteZahl um eins erhöhen. Damit suchst du nun beim nächsten Klick nach der nächsten Zahl, solange, bis die 16 erreicht wurde.



Das Eintragen der Zahlen in das Grid, ist wieder etwas tricky (soll ja nicht so einfach sein).
Im einfachsten Fall, hätte das Grid die 16 Zellen in einer Reihe oder in einer Spalte, dann wäre die Zielspalte für den Eintrag einfach Grid.Cell[GesuchteZahl, 0].

So ist es aber leider nicht, daher musst du abhängig von der GesuchtenZahl in die richtige Zelle schreiben. Dafür gibt es mehrere Möglichkeiten, deren einfachste evtl. ein "Case GesuchteZahl of" ist.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 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