| Autor |
Beitrag |
LuGo
      
Beiträge: 33
|
Verfasst: Do 20.05.10 15:11
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
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Do 20.05.10 15: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
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Do 20.05.10 15:40
Ich denke nicht das dies die Lösung seines Problems ist, oder?
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.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Do 20.05.10 17:19
das terminiert aber eventuell nicht.
Bergmanns Lösung tuts imho schon.
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Do 20.05.10 17:57
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 20.05.10 17: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
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Do 20.05.10 18: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?
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 20.05.10 18: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
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Do 20.05.10 19:04
Was ist denn daran "Haudrauf"  ?
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 20.05.10 19:35
Fällt in die gleiche Kategorie wie Narses' Lieblingsalgorithmus "Endloses Mischen"  .
...und vor allem musste ich daran denken  .
_________________ >λ=
Zuletzt bearbeitet von Kha am Do 20.05.10 22:51, insgesamt 1-mal bearbeitet
|
|
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Do 20.05.10 19: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.
Ich erkenne deine Meinung an, finde meine Methode trotzdem nicht "so" schlecht.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Do 20.05.10 20:04
Hi
Ich habe wohl leider eine veraltete Version von Entpacke-Enggepresste-Verformulierungen.dll installiert: Was will der Fragesteller?
lg,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Zuletzt bearbeitet von Hidden am Do 20.05.10 20:50, insgesamt 1-mal bearbeitet
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Do 20.05.10 20: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?
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Fr 21.05.10 01:06
Ah, danke  Direct-Feed in den Datenkern ohne Interpreter möglich, Großhirn übersprungen
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 @ 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,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Zuletzt bearbeitet von Hidden am Sa 22.05.10 12:22, insgesamt 1-mal bearbeitet
|
|
LuGo 
      
Beiträge: 33
|
Verfasst: Sa 22.05.10 11: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
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Sa 22.05.10 12: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.
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Zuletzt bearbeitet von Hidden am Sa 22.05.10 12:32, insgesamt 4-mal bearbeitet
|
|
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Sa 22.05.10 12:22
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
|