Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - random mit zwei unterschiedlichen einschränkungen
LuGo - Do 20.05.10 16:11
Titel: random mit zwei unterschiedlichen einschränkungen
Hallo Forum,
ich habe eine Frage: Gibt es eine Möglichkeit, die Einschränkungen (z.B. 1-75 und dann 100 - 150) bei random festzuhalten.
LuGo
Bergmann89 - Do 20.05.10 16:27
Hey,
da musst du dir selbst was basteln, aber so schwer is das ja nich:
Delphi-Quelltext
1: 2: 3: 4:
| function MyRandom(min, max: Integer): Integer; begin result := min + random(max-min); end; |
MfG Bergmann
Dude566 - Do 20.05.10 16:40
Ich denke nicht das dies die Lösung seines Problems ist, oder?
http://www.delphibasics.co.uk/RTL.asp?Name=Random
Erzeuge doch einfach Zufallszahlen die zumindest im höchsten Bereich liegen und jage diese dann durch einen Filter, das nur Zufallszahlen die deinen Parametern entsprechen durchkommen.
FinnO - Do 20.05.10 18:19
das terminiert aber eventuell nicht.
Bergmanns Lösung tuts imho schon.
Martok - Do 20.05.10 18:57
FinnO hat folgendes geschrieben : |
| Bergmanns Lösung tuts imho schon. |
Behandelt aber nicht das gesuchte Problem ;)
Eventuell könnte etwas wie:
Delphi-Quelltext
1: 2: 3: 4:
| case Random(2) of 0: Result:= RandomRange(5,10); 1: Result:= RandomRange(20,30); end; |
funktionieren. Für die 2 übernehm ich keine Haftung, kann auch sein dass das dann random(1) wäre, müsste man mal Delphi-Hilfe lesen dazu. Steht drin.
jaenicke - Do 20.05.10 18:59
Das ist aber auch keine so gute Lösung, weil es die Zufallsverteilung durcheinander bringt. Geht aber auch. Besser finde ich:
Delphi-Quelltext
1: 2: 3:
| Result := RandomRange(1, 125); if Result > 75 then Inc(Result, 25); |
Dann hast du einen Zahlenbereich. Wenn der Wert größer als der erste Bereich ist dann addierst du die Differenz zum zweiten dazu so dass die Zahlen in diesem Bereich liegen. Fertig. ;-)
Dude566 - Do 20.05.10 19:11
Ist ja ähnlich wie mein Vorschlag, nur das ich keine Berechnung machen wollte sondern nur gültige Zufallszahlen durchlassen wollte.
Dadurch wird ja nicht die Zufallsverteilung gestört oder?
Kha - Do 20.05.10 19:45
Dude566 hat folgendes geschrieben : |
| Dadurch wird ja nicht die Zufallsverteilung gestört oder? |
Nein, aber ich wähle meist lieber die mathematische als die Draufhau-Methode ;) .
Dude566 - Do 20.05.10 20:04
Was ist denn daran "Haudrauf" :lol: ?
Dude566 - Do 20.05.10 20:58
Ja und mit dem Mathematischen wird doch auch nichts anderes gemacht als der Ausgangswert ausgetauscht, ob ich ihn jetzt abändere wenn er mir nicht passt oder ich den Nächsten versuche.
Edit: Und
Narses beschäftigt sich ja in dem Beitrag eher mit dem Mischen von vorhandenen Werten, was allerdings vom Prinzip her das gleiche ist. :P
Ich erkenne deine Meinung an, finde meine Methode trotzdem nicht "so" schlecht.
Hidden - Do 20.05.10 21:04
Hi :)
Ich habe wohl leider eine veraltete Version von Entpacke-Enggepresste-Verformulierungen.dll installiert: Was will der Fragesteller? :D
lg,
elundril - Do 20.05.10 21:15
er will ein element "e" aus den natürlichen zahlen für das gilt: "e" element aus der menge [1 .. 75] vereinigt mit der menge [100 .. 150].
besser jetzt?
Hidden - Fr 21.05.10 02:06
Ah, danke :D Direct-Feed in den Datenkern ohne Interpreter möglich, Großhirn übersprungen :zustimm:
jaenickes Lösung halte ich für die Beste: Alle Intervalle zusammenschieben, und nach Rnd() wieder trennen.
Fall für n Intervalle:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| type TRange = record Low, High: Integer; end;
function RandomFromIntervals(R: Array of TRange): Integer;
var i: Integer; Elements: Integer; begin for i := 0 to Length(R) - 2 do begin if R[i].High >= R[i+1].Low then begin if R[i].High] > R[i+1].High then R[i+1].High := R[i].High; R[i].High := R[i+1].Low - 1; end; Inc(Elements, R[i].High - R[i].Low + 1); end; i := Length(R) - 1; Inc(Elements, R[i].High - R[i].Low + 1); Elements := RandomRange(1, Elements); i := -1; while Elements > 0 do begin Inc(i); Dec(Elements, R[i].High - R[i].Low + 1); end; result := R[i].High + Elements; end; |
E: Ungetestet!
PM [
http://www.delphi-forum.de/privmsg.php?mode=post"e_post=606287] @ Mistakes
E2: Fehler behoben, falls ein nachfolgendes Intervall Teilmenge des vorherigen ist.
E3: Fehler bei überschneidenden Sets behoben: Erstes gemeinsames Element wurde nicht entfernt
lg,
LuGo - Sa 22.05.10 12:50
Ich glaube ihr habt mein Problem falsch verstanden (und ich nicht gut formuliert). Ich brauche bei der Funktion random zwei verschiedene Zufallszahlenbereiche, die aber in einer Funktion drin sein sollten, die z. B. von 1 bis 75 und dann von 100 bis 150 gehen. Kann ich das mit einer solchen Funktion machen:
Delphi-Quelltext
1: 2: 3:
| procedure irgendwas randomize; Zahl := random (75, 100..150) |
ich hoffe es ist jetzt verständlicher.
LuGo
Hidden - Sa 22.05.10 13:09
Hi :)
Ich glaube, das entspricht der Definition von
elundril:
elundril hat folgendes geschrieben : |
| er will ein element "e" aus den natürlichen zahlen für das gilt: "e" element aus der menge [1 .. 75] vereinigt mit der menge [100 .. 150]. |
Eine Möglichkeit, Random() mit verschiedenen Intervallen aufzurufen, gibt es glaube ich nicht. Das wäre wohl auch zu speziell.
Für eine beliebige Anzahl von Intervallen kannst du meine Version benutzen, für zwei müsstest du dir etwas schreiben: Das hat
jaenicke für deine speziellen 2 Intervalle schon getan, für 2 beliebige müsstest du dir eine Funktion mit 4 Argumenten(untere Grenze 1, u2, o1, o2) wie die von
jaenicke schreiben, das hat er dir glaube ich absichtlich nicht abgenommen ;)
lg,
E:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function RandomFromTwoIntervals(u1, o1, u2, o2): Integer; var Elements: Integer; begin if o1 >= u2 then begin if o1 > o2 then o2 := o1; o1 := u2 - 1; end; Elements := (o1 - u1 + 1) + (o2 - u2 + 1); Elements := Random(Elements); if u1 + Elements <= o1 then result := u1 + Elements else result := u2 + (Elements - (o1 - u1 + 1)); end;
Notenpunkte := RandomFromTwoIntervals(0, 3, 10, 15); |
E2: Oops, Zitat berichtigt.
Dude566 - Sa 22.05.10 13:22
LuGo hat folgendes geschrieben : |
Ich glaube ihr habt mein Problem falsch verstanden (und ich nicht gut formuliert). Ich brauche bei der Funktion random zwei verschiedene Zufallszahlenbereiche, die aber in einer Funktion drin sein sollten, die z. B. von 1 bis 75 und dann von 100 bis 150 gehen. Kann ich das mit einer solchen Funktion machen:
Delphi-Quelltext 1: 2: 3:
| procedure irgendwas randomize; Zahl := random (75, 100..150) |
ich hoffe es ist jetzt verständlicher.
LuGo |
Hat
jaenicke doch schon oben getan, dass in eine Funktion zu packen dürfte ja wohl kein Problem sein.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!