Autor |
Beitrag |
Torsten
      
Beiträge: 160
|
Verfasst: Mo 18.11.02 21:39
Moinsen Leute!
Wollte mich heute mal ein wenig mit Random und Randomize, sprich mit Zufallszahlen beschäftigen, um etwas zu simulieren.
Ich brauche jedenfalls Zahlen im Intervall [0,1].
Es ist also ein geschlossenes Intervall und beinhaltet die 0 sowie die 1.
Random generiert leider Zahlen im Breich 0 <= X < Range. Und mich stört etwas das <. Ich hätte an dieser Stelle gerne ein <=.
Tja, wie mache ich das nun?
Fragende Grüße
Torsten
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 18.11.02 21:58
Mach doch Range um eins größer. 
|
|
Torsten 
      
Beiträge: 160
|
Verfasst: Mo 18.11.02 22:15
Moinsen!
Wie stellst Du Dir das vor?
Range auf 2 setzen?
Dann bekomme ich Zufallszahlen im Bereich von [0, 2)
Und das will ich nicht.
Grüße
Torsten
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 18.11.02 22:36
Zitat: | Dann bekomme ich Zufallszahlen im Bereich von [0, 2) |
Du solltest Dir im Klaren darüber sein, dass Random Dir ganze Zahlen gibt, mit einem Range von 2 also die Zahlen 0 oder 1.
Möchtest Du zufällig erzeugte reelle Zahlen, so solltest Du mit RandomRange Integer-Zahlen eines bestimmten Bereichs erzeugen und diese dann so durch eine Zehnerpotenz teilen, dass Du den gewünschten Bereich erhälst.
Also so:
RandomRange(0,a)/a
Wobei a irgendetwas von der Form 10^x ist mit x aus den natürlichen Zahlen.
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 18.11.02 22:53
Torsten hat folgendes geschrieben: | Moinsen!
Wie stellst Du Dir das vor?
Range auf 2 setzen?
Dann bekomme ich Zufallszahlen im Bereich von [0, 2)
Und das will ich nicht.
Grüße
Torsten |
Du hast gesagt Random liefert dir Zahlen im Bereich von 0 <= x < Range. Beispiel: 0 <= x < 3 liefert dir Zahlen zwischen 0 und 2, wenn du jetzt Zahlen zwischen 0 und 3 haben willst dann gibt als Obergrenze 4 an. So einfach ist das.
Desweitern ist zu beachten, was mein Vorredner gesagt hat: Du bekommst nur Ganzezahlen.
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Mo 18.11.02 22:59
Ich auch noch mal. Das steht
0 <= X < Range
Das bedeutet, daß X größer gleich 0 und kleiner (nicht gleich) Range sein kann. Wenn du also 2 angibst wird das Ergebnis nie 2 sein, da das Ergebnis kleiner 2 sein muß.
|
|
Torsten 
      
Beiträge: 160
|
Verfasst: Di 19.11.02 01:23
Moinsen Leute!
@Peter Lustig
Schon klar. Daher auch meine Verwunderung. Genau das wollte ich nicht.
Ich wollte reelle Zahlen zwischen 0 und 1 (geschlossenes Intervall). Und genau das schafft Random eben nicht.
RandomRange schaut mir da schon etwas besser aus. Besten Dank.
@Luckie
Erst Lesen, dann Schreiben.
Meine ursprüngliche Frage war, wie ich Zufallszahlen zwischen einschließlich 0 und 1 bekomme. Also handelt es sich um reelle Zahlen. Wobei noch nicht mal das stimmt, da es keine echten reellen Zahlen im Rechner gibt. Aber das nur nebenbei.
Random liefert reelle Zahlen, leider nicht bis einschließlich 1. Eben nur bis x < 1. Somit ist Deine Aussage falsch, dass nur ganze Zahlen geliefert werden. Das gilt nur teilweise.
Dennoch Dank für die Antwort.
@Popov
Und? Wie hilft mir das?
Mengenlehre ist eine meiner einfachsten Übungen.
Auch Dir möchte ich dennoch danken.
Letztendlich werde ich mich via RandomRange an die Sache wagen.
Grüße
Torsten
|
|
Cashels
      
Beiträge: 167
|
Verfasst: Di 19.11.02 12:37
Also erst mal rzu allgemeinen Erläuterung von Random.
Mit x := Random erhälts du eine rationale Zahl mit 0 <= x < 1
Mit x := Random(10) erhältst du eine ganze Zahl, mit 0 <= x <= 9. Der Ausgabetyp ist in diesem Fall also auf kein Float mehr.
Aber zur anfänglichen Frage, wie du die 1 in deinen Bereich einbeziehen kannst. Das geht nicht, und das brauchst du auch nicht. Denn die Zahl 1 entspricht in der Tat dem Float 0,999999... genauso entsrpicht die Zahl 0,0000000....1 der Null. Und das nicht nur im Rechner mit begrenzter numerischen Auflösung, sondern auch rein mathematisch. Oder in anderen Worten gesprochen, die Wahrscheinlichkeit die Zufallszahl 0,999999999999 zu erreichen ist verwschwindend klein.
Gruss,
Tom
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 19.11.02 15:25
Torsten hat folgendes geschrieben: | Wobei noch nicht mal das stimmt, da es keine echten reellen Zahlen im Rechner gibt. Aber das nur nebenbei. |
Die von Rechner darstellbaren Zahlen sind eine Teilmenge der reellen Zahlen, daher ist Deine Aussage falsch.
Cashels hat folgendes geschrieben: | Und das nicht nur im Rechner mit begrenzter numerischen Auflösung, sondern auch rein mathematisch. |
Das ist falsch. Die Grenzwerte stimmen mit den von Dir genannten Zahlen überein, aber streng mathematisch gesehen ist Deine Aussage nicht richtig. Du hast Dir dabei sogar die Zahlen ausgesucht, die das besonders deutlich machen: das neutrale Element der Addition und das der Multiplikation. Und die sind nunmal 0 und 1 und nicht 0,00000...01 bzw. 0,99999...
Cashels hat folgendes geschrieben: | Oder in anderen Worten gesprochen, die Wahrscheinlichkeit die Zufallszahl 0,999999999999 zu erreichen ist verwschwindend klein. |
Nicht geringer als für jede andere Zahl auch. Denn 0,9 ist ja nichts anderes als 0,900000000000.
MfG,
Peter
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Cashels
      
Beiträge: 167
|
Verfasst: Di 19.11.02 15:32
Peter Lustig hat folgendes geschrieben: | Das ist falsch. Die Grenzwerte stimmen mit den von Dir genannten Zahlen überein, aber streng mathematisch gesehen ist Deine Aussage nicht richtig. Du hast Dir dabei sogar die Zahlen ausgesucht, die das besonders deutlich machen: das neutrale Element der Addition und das der Multiplikation. Und die sind nunmal 0 und 1 und nicht 0,00000...01 bzw. 0,99999... |
Wer spricht denn da in dir. Der pedante Mathematiker. Ich als Physiker seh das bischen kulanter... Aber nix fuer ungut. Ich hab halt sehr oft mit verschwindend kleinen Wahrscheinlichkeiten zu tun, da uebersieht man manchmal die Details.
Gruss,
tom
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 19.11.02 15:59
Cashels hat folgendes geschrieben: | Ich als Physiker |
Schau mal in mein Profil! Ich hätte ja nichts gesagt, wenn Du nicht geschrieben hättest, dass das in der Mathematik so ist. Denn die Mathematiker sehen das ja nun wirklich so, wie ich das geschildert habe. Ob es uns Physikern nun passt, oder nicht! (Mir passt es in den meisten Fällen ja genauso wenig wie Dir.)
Also, entschuldige wenn ich Dich etwas verstimmt haben sollte.
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Di 19.11.02 16:45
also,
nicht alle reellen Zahlen lassen sich irgendwie darstellen. zumindest nicht grafisch (wozu auch schreiben gehört). 1/3 zum Beispiel ist eine Zahl, die nie endet. Selbst aufschreiben geht nicht, weil man da schreiben kann, bis man schwarz wird. Also ist immer runden angesagt. Daß ist beim Taschenrechner so, und bei Computer demnach erst recht. Die Frage ist nur, wieviele Nachkommastellen einem zur Verfügung stehen. Beim Taschenrechner sind's manchmal weniger als im Computer, manchmal hat man aber auch so gute TRs, daß diese genauso viele Nachkommastellen berechnen (auch wenn sie sie nicht anzeigen), wie der Computer.
Um auf das Anfangsproblem zurückzukehren:
Wie kriege ich eine reelle Zahl im Bereich 0 <= X <= 1?
Random wäre hier eine einfache Wahl, obwohl er nur ganze Zahlen liefert, sobald Range angegeben wird. Das lässt sich aber umgehen, indem man tatsächlich den obigen Vorschlag bachtet und durch Division eine reelle Zahl erzeugt.
Quelltext 1: 2: 3:
| Wert := Random(11)/10 // 1 Nachkommastelle Wert := Random(1001)/10 // 3 Nachkommastellen Wert := Random(1000000001)/10 // 9 Nachkommastellen |
Wie man sieht, ist bei 32bit-Integern nach 9 Stellen Schluß. Wenn's dir nicht so sehr auf Geschwindigkeit ankommt, oder du's sowieso auf einem 64bit-Prozessor laufen lassen möchtest, kannst du auch Int64 nehmen, wodurch sich die Anzahl der möglichen Nachkommastellen erhöht (jedoch auch nur bis zum Limit der Floats, der bei einer Extended-Fließkommazahl bei 20 Stellen liegt (dafür nicht für CLX geeignet)).
Unter Windows und mit Int64 kann man also durchaus die vollen 20 Nachkommastellen des Extended-Typs nutzen, auch mit Random.
Denn dieser gibt nach meinen Experimenten (eben gerade ausprobiert) 0<=X<Range zurück. Also einschließlich 0. Erst wenn Range kleiner ist als 1, macht er Floats, aber ohne 1.
RandomRange macht auch nichts anderes. Er gibt nämlich (zumindest in Delphi 6) immer Integer wieder, keine Floats. Hier würde also das obige Verfahren mit der Division auch nicht entfallen. Und die 0 ist sowieso drin, bei mir aber auch, also wäre Random genauso einfach wie RandomRange. Fragt sich nur noch, was schneller ist. Dafür müsste man das ein paar tausend Mal rechnen und die Zeit mitzählen...
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 19.11.02 17:29
Hi!
tommie-lie hat folgendes geschrieben: | nicht alle reellen Zahlen lassen sich irgendwie darstellen. |
Das hat auch niemand behauptet! Aber die Zahlen, die im Rechner dargestellt werden, sind reelle Zahlen.
zu Deinem Codebeispiel: wahrscheinlich weißt Du es und es sollte nur das Prinzip verdeutlichen, aber damit bekommst Du sehr viel größere Zufallszahlen, als verlangt wurden!
Mir ist gerade noch eine sehr aufwändige Methode eingefallen: man könnte ein Array machen, in dem man die einzelnen Stellen speichert und dann jedes Element des Arrays einzeln zufällig erzeugen. Damit bekommt ziemlich viele Nachkommastellen hin.
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Di 19.11.02 17:45
Peter Lustig hat folgendes geschrieben: |
zu Deinem Codebeispiel: wahrscheinlich weißt Du es und es sollte nur das Prinzip verdeutlichen, aber damit bekommst Du sehr viel größere Zufallszahlen, als verlangt wurden!
|
Uuuups.
*mist*e.
Stimmt, ich habe die Dinger umgedreht.
Richtig wäre natürlich
Quelltext
Tschüß
Thomas
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
Cashels
      
Beiträge: 167
|
Verfasst: Di 19.11.02 18:34
Peter Lustig hat folgendes geschrieben: | Also, entschuldige wenn ich Dich etwas verstimmt haben sollte. |
Na von verstimmen war doch nie die Rede.
Gruss,
tom
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Mi 20.11.02 02:17
@Torsten
Popov hat folgendes geschrieben: | 0 <= X < Range
Das bedeutet, daß X größer gleich 0 und kleiner (nicht gleich) Range sein kann. Wenn du also 2 angibst wird das Ergebnis nie 2 sein, da das Ergebnis kleiner 2 sein muß. |
Torsten hat folgendes geschrieben: | @Popov
Und? Wie hilft mir das?
Mengenlehre ist eine meiner einfachsten Übungen.
Auch Dir möchte ich dennoch danken. |
Ich glaube nicht, daß es einer deiner einfachsten Übungen ist. Allerdings hab ich meiner Oma von deinem Problem erzählt und gefragt wie sie das lösen würde. Die sagte du solltes das nicht mit Random(1), sondern mit Random(100 + 1) und dann das ganze wieder durch 100 teilen. Ich hab das dann so wie sie mir gesagt hat in Delphi eingegeben und das ist dabei rausgekommen (du brauchst ein Button1 und ListBox1):
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := 0 to 1000 do begin ListBox1.Items.Add(FloatToStr(Random(100 + 1) / 100)); with ListBox1 do if Items[Items.Count - 1] = '1' then ShowMessage(IntToStr( i )); end; end; |
Cirka alle 100 Werte kommt auch eine 1 vor.
Wenn du also das nächste mal eine Antwort bekommst die nur ein Teil der Lösung ist, dann denk bitte ein Schritt weiter und setz das gesagte um.
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Mi 20.11.02 17:15
das ist übrigens genau das gleiche, was ich geschrieben habe. Nur daß bei mir die Zahlen verwechselt wurden (wer das wohl war...  )
@ Popov:
Kann deine Oma denn programmieren? Oder was macht die so? Ich kann mir gar nicht vorstellen, daß eine Oma so fit in Mathe ist...
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
|