Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Random-Frage (https://www.delphipraxis.net/64057-random-frage.html)

cruso 26. Feb 2006 21:02


Random-Frage
 
Hi!

Ist es mit Hilfe einer fertigen Funktion o.ä. möglich, die Random-Funktion dazu zu bringen, dass nie 2mal hintereinander die gleiche Zahl ausgegeben wird oder muss man dies auf jeden Fall "per Hand" erledigen?



MfG
Cruso

Dust Signs 26. Feb 2006 21:06

Re: Random-Frage
 
Das musst du per Hand erledigen - oder du programmierst dir einen perfekten Zufallsgenerator :mrgreen:

Dust Signs

Der_Unwissende 26. Feb 2006 21:56

Re: Random-Frage
 
Zitat:

Zitat von Dust Signs
oder du programmierst dir einen perfekten Zufallsgenerator :mrgreen:

Sorry, aber das ist eine lustige Idee. Wenn er perfekt ist, dann muss irgendwann eine Zahl mindestens zwei mal hinter einander kommen. Genau daran erkennst du Zufallszahlen, die von Hand erzeugt wurden und solche die echt zufällig sind (gleiche Zahl zwei mal oder mehr ist nicht unmöglich, sondern unwahrscheinlicher).
Also wenn du echt zufällige Zahlen möchtest, dann wird dir Random natürlich nicht viel bieten können, aber für den Pseudozufall reicht's und der ist für Vieles zufällig genug ;-)

Gruß Der Unwissende

Nicodius 26. Feb 2006 22:07

Re: Random-Frage
 
du kansnt hier suchen es gab mal nen thread dazu
am besten du speicherst die letzte zahl in eine variable und wiederholst den random vorgang solange bis es nicht merh die gleiche zahl ist :D

cruso 26. Feb 2006 22:19

Re: Random-Frage
 
Zitat:

Zitat von Nicodius
du kansnt hier suchen es gab mal nen thread dazu
am besten du speicherst die letzte zahl in eine variable und wiederholst den random vorgang solange bis es nicht merh die gleiche zahl ist :D

Das war genau das was ich mit "von Hand" meinte!

Nicodius 26. Feb 2006 22:53

Re: Random-Frage
 
das weiss ich nur von hand hätte er sich selbst auch sagen können :mrgreen:

Waldteufel 27. Feb 2006 11:14

Re: Random-Frage
 
Hi.

Hierzu möchte ich anmerken, dass dieser Algorithmus weniger Schleifendurchläufe braucht und außerdem nicht in einer Endlosschleife hängen bleiben kann. (Stellt euch mal vor, die Zufallszahl ist immer 5 - wird wahrscheinlich selten vorkommen, aber wenn's wirklich Zufallszahlen sind kann das passieren).

Anmerkung: Oder habe ich jetzt die Frage falsch verstanden und du willst nur vermeiden, dass die Zahlenfolge so aussieht:
1 52 35 42 42 (so nicht) 56 42 (diese 42 darf da stehen) 62 77 28?

Oder willst du dass nie eine Zahl nochmal vorkommt, nachdem sie schon mal vorkam, also so:
1 52 35 42 56 42 (diese 42 darf da nicht stehen, weil sie schonmal vorkam)

:gruebel:


[edit2] @Frickeldrecktuxer_TM: Danke für den Hinweis. :oops: [/edit2]

cruso 27. Feb 2006 20:04

Re: Random-Frage
 
Eine Zahl soll nie 2mal hintereinander vorkommen.
Folgendes wäre also nicht gewollt: 3, 76, 12, 12;
Das wäre ok: 3, 76, 12, 76, 12;

turboPASCAL 27. Feb 2006 20:08

Re: Random-Frage
 
Wie gesagt, selber machen. Speichere die letzte Zahl und beim nächsten Random prüfst du ob die Zahl beim letzten mal schon dabei war. ;)

Frickeldrecktuxer_TM 27. Feb 2006 20:29

Re: Random-Frage
 
@waldteufel
in deinem c++ code fehlt entweder einmal "using namespace std" oder zweimal "std::" an geeigneter stelle ;-)

Airblader 27. Feb 2006 20:35

Re: Random-Frage
 
Zitat:

Zitat von Waldteufel
wird wahrscheinlich selten vorkommen, aber wenn's wirklich Zufallszahlen sind kann das passieren).

Unendlich oft hintereinander? Wir hatten noch keine Wahrscheinlichkeitsrechnungen, aber irgendwann muss doch was anderes kommen :gruebel:

Ist es eig. Zufall, dass du als Beispiel die Zahl 42 nimmst? :mrgreen:

cruso 27. Feb 2006 21:14

Re: Random-Frage
 
Zitat:

Zitat von Airblader
Ist es eig. Zufall, dass du als Beispiel die Zahl 42 nimmst? :mrgreen:

Wenn es die "23" wäre, dann wäre es bedenklicher!* :-D


*Falls ihr den Film kennt

cruso 28. Feb 2006 10:03

Re: Random-Frage
 
Zitat:

Zitat von turboPASCAL
Wie gesagt, selber machen. Speichere die letzte Zahl und beim nächsten Random prüfst du ob die Zahl beim letzten mal schon dabei war. ;)

Ja gut, das dachte ich auch nur hab' ich es jetzt mal versucht und komischerweise klappt es nicht. Ich habe schon mehrere Möglichkeiten ausprobiert. Könnt ihr mir helfen?

Nils_13 28. Feb 2006 10:11

Re: Random-Frage
 
Ich habe mir das bisher so gedacht (ist noch nicht ganz fertig, will es euch aber nicht vorenthalten):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i, letztezahl: Integer;
begin
  i := random(100);
  letztezahl := kA, wie du die letzte Zahl kriegst, da brauch ich auch noch Hilfe
  if i = letztezahl then
    random(100);
  ShowMessage(IntToStr(i));
end;

Mavarik 28. Feb 2006 10:20

Re: Random-Frage
 
Zitat:

Zitat von Nils_13
Ich habe mir das bisher so gedacht (ist noch nicht ganz fertig, will es euch aber nicht vorenthalten):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i, letztezahl: Integer;
begin
  i := random(100);
  letztezahl := kA, wie du die letzte Zahl kriegst, da brauch ich auch noch Hilfe
  if i = letztezahl then
    random(100);
  ShowMessage(IntToStr(i));
end;

Ujiii und wenn der 2. Random auch wieder die gleiche Zahl bringt?

Delphi-Quellcode:

var letztezahl : integer;
procedure TForm1.Button1Click(Sender: TObject);
var i : Integer;
{$IFDEF GANZSICHER}
   Count : integer;
{$ENDIF}
begin
  {$IFDEF GANZSICHER}
  Count := 0;
  {$ENDIF}
  repeat
    i := random(100);
    {$IFDEF GANZSICHER}
    inc(Count);
    {$ENDIF}

  Until (i <> letztezahl) {$IFDEF GANZSICHER} and (count < 1000) {$ENDIF};
 
  letztezahl := i;

  ShowMessage(IntToStr(i));
end;

begin
  letztezahl := 0;
end.

Frank

turboPASCAL 28. Feb 2006 10:51

Re: Random-Frage
 
Mal meine Lösung, so in der Pause aus dem Kopf....

Auf die Form muss ein Button, Timer, Memo.
Delphi-Quellcode:
implementation

{$R *.dfm}

var RandomZahlAlt: Word;

function RandomForMe(MaxRange: Word): Word;
begin
  repeat
    Result := Random(MaxRange+1);
  until RandomZahlAlt <> Result;
  RandomZahlAlt := Result;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
  Timer1.Interval := 150;
  Timer1.Enabled := False;
  Button1.Caption := 'Off';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Memo1.Lines.Append(InttoStr(RandomForMe(100)));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Enabled := not Timer1.Enabled;

  if Timer1.Enabled then Button1.Caption := 'On'
    else Button1.Caption := 'Off'
end;

end.

Grishnak 28. Feb 2006 10:53

Re: Random-Frage
 
Noch eine kleine Änderung:

Zitat:

Zitat von Mavarik
Delphi-Quellcode:

var letztezahl : integer;
procedure TForm1.Button1Click(Sender: TObject);
var i : Integer;
{$IFDEF GANZSICHER}
   Count : integer;
{$ENDIF}
begin
  {$IFDEF GANZSICHER}
  Count := 0;
  {$ENDIF}
  repeat
    i := random(100);
    {$IFDEF GANZSICHER}
    inc(Count);
    {$ENDIF}

  Until (i <> letztezahl) {$IFDEF GANZSICHER} and (count < 1000) {$ENDIF};
 
  letztezahl := i;

  ShowMessage(IntToStr(i));
end;

begin
  randomize; // Zufallszahl-Generator initialisieren
  letztezahl := random(100); // nicht immer 0 als erste Zahl
end.

Frank


turboPASCAL 28. Feb 2006 10:56

Re: Random-Frage
 
Bist du sicher das man die letztezahl initialisieren muss ? Ist doch egal was da drinne steht. ;)

Mavarik 28. Feb 2006 11:40

Re: Random-Frage
 
Zitat:

Zitat von turboPASCAL
Bist du sicher das man die letztezahl initialisieren muss ? Ist doch egal was da drinne steht. ;)

Muss nicht, ist aber ein besserer Stiel!

Frank :roll:

turboPASCAL 28. Feb 2006 11:56

Re: Random-Frage
 
Zitat:

Zitat von Mavarik
Muss nicht, ist aber ein besserer Stiel!

Frank :roll:

Ich habe mal gelernt das Programierer schreibfaul sind. Desshalb gibt es ja auch C. ;)

Besserer Stiel ? Eleganterer Stiel ?! :mrgreen:

cruso 28. Feb 2006 12:00

Re: Random-Frage
 
So! Also mein Problem ist gelöst! Jetzt kommt nie 2mal die gleiche Zahl direkt hintereinander:

Delphi-Quellcode:
//...
  x:=Form1.ListBox1.Items.Count;
  //----
  Randomize;
  y:=StrToInt(Label1.Caption);
  z:=Random(x);
  if z=y then begin
  While (z=y) do begin
  z:=Random(x)
  end;
  Label1.Caption:=IntToStr(z);
  end else begin
  Label1.Caption:=IntToStr(z);
  end;

Ist zwar net die feinste Art aber an statt des Labels könnte man es auch in ner Datei abspeichern.

turboPASCAL 28. Feb 2006 12:05

Re: Random-Frage
 
Zitat:

Zitat von cruso
Ist zwar net die feinste Art aber an statt des Labels könnte man es auch in ner Datei abspeichern.

:gruebel: In ner Datei abspeichern?

Warum machst du denn das so Umständlich mit einem Label und so ? Hast du mal den Code von oben Versucht?

cruso 28. Feb 2006 12:14

Re: Random-Frage
 
Zitat:

Zitat von turboPASCAL
Warum machst du denn das so Umständlich mit einem Label und so ? Hast du mal den Code von oben Versucht?

Den Code von oben hab ich net probiert, da ich das ganze in einer Datei abspeichern muss, damit es auch beim nächsten programmstart sich net wiederholt.



Weis irgendjemand wie man am einfachsten einen String in einer Datei abspeichern kann? Warum geht folgendes nicht?

Delphi-Quellcode:
s.SaveToFile(Filename);

cruso 28. Feb 2006 12:25

Re: Random-Frage
 
Eine Frage? Warum endet folgender Code in einer Endlisschleige und wie wäre es richtig?

Delphi-Quellcode:
  x:=Form1.ListBox1.Items.Count;
  //----
  if x>0 then begin
  Randomize;
  y:=StrToInt(Form3.Label1.Caption);
  z:=Random(x);
  if z=y then begin
  While (z=y) do begin
  z:=Random(x)
  end;
  Form3.Label1.Caption:=IntToStr(z);
  end else begin
  Form3.Label1.Caption:=IntToStr(z);
  end;
  end else z:=0;

Diese Frage hat sich erledigt! Da ich eine ListBox verwende muss es if x<0 heißen. :lol:

turboPASCAL 28. Feb 2006 12:34

Re: Random-Frage
 
Zitat:

Zitat von cruso
Zitat:

Zitat von turboPASCAL
Warum machst du denn das so Umständlich mit einem Label und so ? Hast du mal den Code von oben Versucht?

Den Code von oben hab ich net probiert, da ich das ganze in einer Datei abspeichern muss, damit es auch beim nächsten programmstart sich net wiederholt.

Hm, verstehe ich jetzt nicht. Es soll beim Programmstart nicht mit der letzten Zahl (von dem letzten Programm start) begonnen werden ? Richtig ?



Zitat:

Zitat von cruso
Weis irgendjemand wie man am einfachsten einen String in einer Datei abspeichern kann? Warum geht folgendes nicht?

Delphi-Quellcode:
s.SaveToFile(Filename);

Du kannst doch einfach eine Ini-file benutzen.

Delphi-Quellcode:
procedure SaveOldValue...
begin
  with TIniFile.Create(ChangeFileExt(ParamStr(0), 'ini')) do
  begin
    try
      WriteString('AlteZufallszahl', 'Value', InttoStr(AlteZahlAlsString));
      //  WriteInteger('AlteZufallszahl', 'Value', InttoStr(AlteZahlAlsInteger));
    finally
      Free;
    end;
  end;
end;
Erklärung:

Es wird eine Inidatei angelegt die den selben Namen hat wie das Programm ( ParamStr(0) ).

Delphi-Quellcode:
with TIniFile.Create(ChangeFileExt(ParamStr(0), 'ini')) do
Kurtzform für:
Delphi-Quellcode:
var AnyIniFile: TInifile;
begin
  AnyIniFile := TIniFile.Create(...
  try
    AnyIniFile.WriteInteger(...
    //...
  finally
    AnyIniFile.free;
  end;
end;

Nils_13 28. Feb 2006 14:09

Re: Random-Frage
 
Jetzt nur mal interesshalber: Warum darf die selbe Zahl beim nächsten Programmstart nicht auftauchen ? Irgendwann hat es sich ausgerandomt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr.

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