![]() |
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... |
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 ;)
|
Re: aus Randomwertebereich Zahlen ausschließen???
Ungefähr so:
Delphi-Quellcode:
Hoffe das ist was du meinst... :gruebel:
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; |
Re: aus Randomwertebereich Zahlen ausschließen???
Entweder du machste es in 'ner Schleife (wie Ulti schon sagte)
Delphi-Quellcode:
[add]@igel457: mann kann es sich natürlich auch umständlicher machen ^^[/add]
Repeat
i := Random... Until (i <> 12) and (i <> 50) and (i <> 88); 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:
oder du splittest und verschiebts die Teile
i := Random(98);
case i of 12: i := 98; 50: i := 99; 88: i := 100; end;
Code:
1234567890
123 45 6 7890
Delphi-Quellcode:
[add2]
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); für meine Beispiele hab ich mal noch 'nen 3. Wert eingeführt, damit es verständlicher wird :mrgreen: |
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 |
Re: aus Randomwertebereich Zahlen ausschließen???
bitte nicht so programmieren...
Zitat:
Delphi-Quellcode:
Denn warum soll ein Ausdruck der wahr/falsch ergibt nochmal umgesetzt werden in wahr/falsch?
:
inarea := not ((la = 10) or (la = 55)); : MfG Thorsten |
Re: aus Randomwertebereich Zahlen ausschließen???
@omata:
dann kannst du auch glauch aus
Delphi-Quellcode:
dieses machen ^^
inarea := not ((la = 10) or (la = 55));
Delphi-Quellcode:
(was dann gleich wieder zu meinem 1. Code-Beispiel führt)
inarea := (la <> 10) and (la <> 55);
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) |
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: ![]() 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; |
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 |
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:
Ü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.
Var myByteSet : Set of Byte;
... myByteSet := [5..8,27,93..96]; ... repeat la:=random(100); until not (la in myByteSet); ... //Edit: Integer in Byte geändert, thx to himitsu |
Re: aus Randomwertebereich Zahlen ausschließen???
@leddl:
weil es in etwa auf das Gleiche, wie die Repeat-Scheife in meinem ersten Beitrag hinausgeht. Wobei du in einem Set bestimmten Beschänkungen unterliegst. Zitat:
Bei mir sagen alle Delphiversionen "[Fehler] ... Mengen (Sets) dürfen nur maximal 256 Elemente besitzen" zu:
Delphi-Quellcode:
Var myIntegerSet : Set of Integer;
|
Re: aus Randomwertebereich Zahlen ausschließen???
Zitat:
Zitat:
Aber das is ja kein Problem. Änder Integer in Byte und es passt. Is einfacher und übersichtlicher, als alle Zahlen in ne if-Klausel zu schreiben und Byte reicht auch absolut aus, da er nur Zahlen bis 100 braucht. |
Re: aus Randomwertebereich Zahlen ausschließen???
OK, ich hab nicht Liste gemeint, sondern Set. Hab das etwas durcheinanger gebracht. :oops:
Grüße Faux |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:10 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