AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi aus Randomwertebereich Zahlen ausschließen???
Thema durchsuchen
Ansicht
Themen-Optionen

aus Randomwertebereich Zahlen ausschließen???

Ein Thema von mosquito · begonnen am 20. Nov 2005 · letzter Beitrag vom 21. Nov 2005
Antwort Antwort
Seite 1 von 2  1 2      
mosquito

Registriert seit: 31. Okt 2005
22 Beiträge
 
#1

aus Randomwertebereich Zahlen ausschließen???

  Alt 20. Nov 2005, 21:15
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...
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#2

Re: aus Randomwertebereich Zahlen ausschließen???

  Alt 20. Nov 2005, 21:16
Ausschließen geht IMHO nicht, aber lass doch einfach ne neue Zahl erzeugen, wenn die vorherige generierte eine "verbotene" ist
Julian J. Pracht
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#3

Re: aus Randomwertebereich Zahlen ausschließen???

  Alt 20. Nov 2005, 21:22
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...
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#4

Re: aus Randomwertebereich Zahlen ausschließen???

  Alt 20. Nov 2005, 21:25
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: aus Randomwertebereich Zahlen ausschließen???

  Alt 20. Nov 2005, 21:26
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
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: aus Randomwertebereich Zahlen ausschließen???

  Alt 20. Nov 2005, 21:30
bitte nicht so programmieren...
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#7

Re: aus Randomwertebereich Zahlen ausschließen???

  Alt 20. Nov 2005, 21:35
@omata:
dann kannst du auch glauch aus
inarea := not ((la = 10) or (la = 55)); dieses machen ^^
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#8

Re: aus Randomwertebereich Zahlen ausschließen???

  Alt 20. Nov 2005, 21:48
@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.

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;
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: aus Randomwertebereich Zahlen ausschließen???

  Alt 20. Nov 2005, 21:50
@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
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#10

Re: aus Randomwertebereich Zahlen ausschließen???

  Alt 20. Nov 2005, 22:00
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
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:01 Uhr.
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