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 aus Randomwertebereich Zahlen ausschließen??? (https://www.delphipraxis.net/57408-aus-randomwertebereich-zahlen-ausschliessen.html)

mosquito 20. Nov 2005 20:15


aus Randomwertebereich Zahlen ausschließen???
 
Hallo alle zusammen...

Wenn man eine Randomfunktion ausführt, so werden zufällig Zahlen aus dem gewählten Bereich ausgesucht.
( randomize; la:=random(100); // Zahlen von 0 bis 100)
Wenn ich nun aber eine oder mehrere Zahlen aus dieser Menge ausschließen möchte, wie ist das möglich???
(z.B. die 12 und 50 aus 0 bis 100 ausschließen)

Bitte helft mir

m.f.g. Mosquito...

Ultimator 20. Nov 2005 20:16

Re: aus Randomwertebereich Zahlen ausschließen???
 
Ausschließen geht IMHO nicht, aber lass doch einfach ne neue Zahl erzeugen, wenn die vorherige generierte eine "verbotene" ist ;)

igel457 20. Nov 2005 20:22

Re: aus Randomwertebereich Zahlen ausschließen???
 
Ungefähr so:

Delphi-Quellcode:
var inArea:boolean;
begin
  inArea := false;
  while not inArea do
  begin
   la := random(100);
   if not ((la = 10) or (la = 55)) then inarea := true else inarea := false;
  end;
end;
Hoffe das ist was du meinst... :gruebel:

himitsu 20. Nov 2005 20:25

Re: aus Randomwertebereich Zahlen ausschließen???
 
Entweder du machste es in 'ner Schleife (wie Ulti schon sagte)

Delphi-Quellcode:
Repeat
  i := Random...
Until (i <> 12) and (i <> 50) and (i <> 88);
[add]@igel457: mann kann es sich natürlich auch umständlicher machen ^^[/add]


Oder du berechest das Ergebnis

0..100 = 101 mögliche Werte
12, 50 und 88 ausschließen = nur noch 98 mögliche Werte
also erzeugst du eine zufallszahl 0..97
und skalierst dieses ergebnis in dein tatsächliches Ergebnis hinein.

entweder indem du die ungewünschten Werte nach hinten verschiebst
Code:
1234567890
123 56 8 0479
Delphi-Quellcode:
i := Random(98);
case i of
  12: i := 98;
  50: i := 99;
  88: i := 100;
end;
oder du splittest und verschiebts die Teile
Code:
1234567890
123 45 6 7890
Delphi-Quellcode:
i := Random(99);
if i >= 88-2 then inc(i, 3)
else if i >= 50-1 then inc(i, 2)
else if i >= 12 then inc(i);
[add2]
für meine Beispiele hab ich mal noch 'nen 3. Wert eingeführt, damit es verständlicher wird :mrgreen:

faux 20. Nov 2005 20:26

Re: aus Randomwertebereich Zahlen ausschließen???
 
Könnte man das nicht mit Listen machen? Wenn man schon in einer Sprache programmiert, die Listen unterstützt (und das zuen meines Wissens nur wenige), dann sollte man diese auch nutzen... ;)

Grüße
Faux

omata 20. Nov 2005 20:30

Re: aus Randomwertebereich Zahlen ausschließen???
 
bitte nicht so programmieren...
Zitat:

Zitat von igel457
Delphi-Quellcode:
   :
   if not ((la = 10) or (la = 55)) then inarea := true else inarea := false;
   :

dies ist wesentlich sinnvoller...
Delphi-Quellcode:
   :
   inarea := not ((la = 10) or (la = 55));
   :
Denn warum soll ein Ausdruck der wahr/falsch ergibt nochmal umgesetzt werden in wahr/falsch?

MfG
Thorsten

himitsu 20. Nov 2005 20:35

Re: aus Randomwertebereich Zahlen ausschließen???
 
@omata:
dann kannst du auch glauch aus
Delphi-Quellcode:
inarea := not ((la = 10) or (la = 55));
dieses machen ^^
Delphi-Quellcode:
inarea := (la <> 10) and (la <> 55);
(was dann gleich wieder zu meinem 1. Code-Beispiel führt)

Und ich pogrammiere auch manchmal so (mit IF-THEN) ... vorallem wenn ich mal nicht mit den Standard-Booleans arbeite :)
(Verboten ist es schließlich nicht, auch wenn die direkte Zuweisung oftmals besser erkennen lät, was dort gemacht wird)

igel457 20. Nov 2005 20:48

Re: aus Randomwertebereich Zahlen ausschließen???
 
@himitsu

Auch wenn das eigentlich OT ist...

Ja, ich weiß ich habe gesündigt. Das ist mir auch gekommen, nachdem der nächstebeitrag gekommen ist. :angel2:

Mit der Repeat..Until schleife ist es natürlich noch besser.

Zurück zum Thema:

Natürlich geht das auch mit Listen. Als erstes benötigst du mal eine Integer Liste. Entweder du programmierst sie selbst oder suchst einfach hier: Hier im Forum suchenTIntegerList

Und dann schreibst du dir eine Funktion die das macht:

Delphi-Quellcode:
function ForbbidenRandom(List:TIntegerList;Area:Integer):integer;
var i,r:integer;
    inarea:boolean;
begin
  while not inarea do
  begin
    r := random(area);
    for i := 0 to list.count-1 do
    begin
      inarea := r <> list[i];
      if not inrea then break;
    end;
  end;
end;

omata 20. Nov 2005 20:50

Re: aus Randomwertebereich Zahlen ausschließen???
 
@himitsu

ja klar kann man das und es ist auch nicht verboten das andere zu machen.
Was dein Umsetzen angeht, da ist schon wieder etwas Gedankenschmalz von nöten, auch wenn das hier nicht so anstrengend ist. So ging es mir mehr darum, wenn man ein IF-THEN-ELSE-Kontrukt baut und man im THEN- und ELSE-Teil einen Boolschenausdruck gegensätzlich setzt, so kann man den Ausdruck der in der IF-Bedingung steht (ohne zu überlegen) der boolschen Variable übergeben.

Und dann wird es übersichtlicher und man kann noch einen zweiten Optimierungsschritt hinterherschieben (deinen Vorschlag).

Hurra, dann schliesst sich der Kreis.

MfG
Thorsten

leddl 20. Nov 2005 21:00

Re: aus Randomwertebereich Zahlen ausschließen???
 
:gruebel: Warum denn so kompliziert mit ner Liste? Warum is noch keiner auf den einfachsten Gedanken gekommen? Benutz ein Set of Byte, dann kannst du ganz einfach mit
Delphi-Quellcode:
Var myByteSet : Set of Byte;
...
myByteSet := [5..8,27,93..96];
...
repeat
  la:=random(100);
until not (la in myByteSet);
...
Übrigens: Nimm das Randomize mal aus der Funktion, falls die mehrmals aufgerufen wird. Randomize solltest du im Programm nur ein einziges Mal aufrufen, zB im OnCreate der Form.

//Edit: Integer in Byte geändert, thx to himitsu


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:56 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