Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zufallszahl mit Ausnahme (https://www.delphipraxis.net/111505-zufallszahl-mit-ausnahme.html)

Stefan92 4. Apr 2008 13:39


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

Klaus01 4. Apr 2008 13:42

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

sirius 4. Apr 2008 13:42

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)];

MacGuyver 4. Apr 2008 13:43

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);

Fussball-Robby 4. Apr 2008 13:48

Re: Zufallszahl mit Ausnahme
 
Zitat:

Zitat von MacGuyver
Moin auch :hi:

Ganz einfach:
Delphi-Quellcode:
if i = 3 then
  Inc(i)
else
  if i = 5 then
    Inc(i,2);

So wären die Zahlen nicht mehr zufällig, da die 4 und die 7 häufiger kommen würden.
Mfg

Stefan92 4. Apr 2008 13:50

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

cruiser 4. Apr 2008 14:39

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;

Stefan92 4. Apr 2008 21:35

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;

marabu 5. Apr 2008 08:30

Re: Zufallszahl mit Ausnahme
 
Hallo Stefan,

du kannst dein Problem auch als zufällige Neuanordnung einer gegebenen Menge von Zeichen (Mischen) betrachten:

Delphi-Quellcode:
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;
Grüße vom marabu

grenzgaenger 5. Apr 2008 12:38

Re: Zufallszahl mit Ausnahme
 
Zitat:

Zitat von Stefan92
Ursprünglich ging es darum, jedem Buchstaben im Alphabet einen anderen zuzuweisen, ohne dass dabei einer doppelt oder mehrfach vorkommt.

das klingt mir nach Bei Google suchenmonoalphabetische verschlüsselung. gehts in die richtung? falls ja findest du hier In der Entwickler-Ecke suchenmonoalphabetische und hier Hier im Forum suchenmonoalphabetische sicher genügend beispiele, wie sich ein alphabet mappen lässt.

<HTH>


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr.
Seite 1 von 2  1 2      

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