![]() |
Zufallszahl mit Ausnahme
So, nach längerer Pause hätte ich mal wieder eine Frage.
Und zwar möchte ich eine Zufallszahl ermitteln, wobei es im Zahlenbereich Ausnahmen gibt. Ein einfaches Beispiel: Ich möchte eine zufällige Zahl von 1 bis 10 ziehen, wobei die Zahlen 3 und 5 nicht gezogen werden dürfen. Die Zahlen 3 und 5 sollen später beliebig sein. Natürlich könnte ich jedesmal, wenn eine verbotene Zahl vorkommt nochmal die Zufallsfunktion aufrufen, doch das könnte im schlimmsten Falle lange Wartezeiten verursachen. Hat jemand eine Idee, wie ich dieses Problem effizient und elegant löse? Ich hoffe, ich habe es einigermaßen verständlich formuliert. Gruß Stefan |
Re: Zufallszahl mit Ausnahme
Hallo,
Du könntest Dir alle Zahlen die Du haben möchtest in ein Array of Integer packen, die Indizes dann per random auswählen. Grüße Klaus |
Re: Zufallszahl mit Ausnahme
Delphi-Quellcode:
const Zufallszahlen:array[0..7] of byte=(1,2,4,6,7,8,9,10);
... Zahl:=Zufallszahlen[random(8)]; |
Re: Zufallszahl mit Ausnahme
Moin auch :hi:
Ganz einfach:
Delphi-Quellcode:
if i = 3 then
Inc(i) else if i = 5 then Inc(i,2); |
Re: Zufallszahl mit Ausnahme
Zitat:
Mfg |
Re: Zufallszahl mit Ausnahme
Danke für die vielen Antworten.
Ich werde es mit einem dynamischen Array machen, da sich die verbotenen Werte in jedem Durchlauf erhöhen werden. Damit wäre das Problem gelöst, danke! Gruß Stefan |
Re: Zufallszahl mit Ausnahme
Noch ein kleiner Beitrag zum Thema:
Delphi-Quellcode:
function RandomBeside(const min, max: Integer; const beside: array of Integer): Integer; overload;
var i, j: Integer; inarray: Boolean; begin repeat i := Random(max - min) + min; inarray := False; for j := 0 to Length(beside) - 1 do if beside[j] = i then begin inarray := True; Break; end; until (not inarray); Result := i; end; function RandomBeside(const max: Integer; const beside: array of Integer): Integer; overload; begin Result := RandomBeside(0, max, beside); end; procedure TForm1.Button1Click(Sender: TObject); var rnd: Integer; begin // Zufalls Zahl zw. 0 und 9 ausser 3,5 und 7 rnd := RandomBeside(10, [3, 5, 7]); end; |
Re: Zufallszahl mit Ausnahme
Danke, werde ich auch mal ausprobieren.
Ursprünglich ging es darum, jedem Buchstaben im Alphabet einen anderen zuzuweisen, ohne dass dabei einer doppelt oder mehrfach vorkommt. Ich poste mal meinen Code (leider noch unkommentiert):
Delphi-Quellcode:
function Alphabet_Neu: String;
var ErlaubteZeichen: array of char; i, j, zufall: Integer; zeichen, hilf: Char; begin SetLength(ErlaubteZeichen, 26); for j := 0 to High(ErlaubteZeichen) do ErlaubteZeichen[j] := chr(ord('A') + j); for i := 1 to 26 do begin zufall := Low(ErlaubteZeichen) + Random(High(Erlaubtezeichen) - Low(ErlaubteZeichen) + 1); zeichen := ErlaubteZeichen[zufall]; hilf := ErlaubteZeichen[zufall]; ErlaubteZeichen[zufall] := ErlaubteZeichen[High(ErlaubteZeichen)]; ErlaubteZeichen[High(ErlaubteZeichen)] := hilf; SetLength(ErlaubteZeichen, 26 - i); result := result + zeichen + ' '; end; end; procedure TfrmAlphabet.BtnNewAlphabetClick(Sender: TObject); begin PnlNeu.Caption := Copy(Alphabet_Neu, 1, length(Alphabet_Neu) - 1); end; |
Re: Zufallszahl mit Ausnahme
Hallo Stefan,
du kannst dein Problem auch als zufällige Neuanordnung einer gegebenen Menge von Zeichen (Mischen) betrachten:
Delphi-Quellcode:
Grüße vom marabu
function Shuffle(const s: string): string;
var i, iRand: Integer; cTemp: Char; begin Result := s; for i := Length(Result) downto 2 do begin iRand := Succ(Random(i)); cTemp := Result[i]; Result[i] := Result[iRand]; Result[iRand] := cTemp; end; end; |
Re: Zufallszahl mit Ausnahme
Zitat:
![]() ![]() ![]() <HTH> |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 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