Deutsch
Forum

Rnd() aus Wert größer als Long

 

Jörg
Sellmeyer
Gibt es eine Möglichkeit eine Zufallszahl aus einem Bereich jenseits der Longgrenze zu ermitteln.

Wenn ich
Var n! = 4^16
Print Rnd(n!)
verwende, kommt nur 0 raus. Gibts da was per Api oder so?
Gruß
Jörg
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
08.12.2007  
 



Ab in String und dann zum Float oder meinst Du etwas anderes?
KompilierenMarkierenSeparieren
 
08.12.2007  
 




Jörg
Sellmeyer
Ja das hab ich schon, aber die Zahlen dürfen nicht höher als 4^16 sein.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
08.12.2007  
 




Jörg
Sellmeyer
Seltsam - warum taucht denn Franks Beitrag nur hier auf:
[...] 

Die Lösungen haben leider alle den Nachteil, daß sie keine 4^16 zu 1 Wahrscheinlichkeit abbilden, sondern irgendwelche kombinatorischen.
Z. B. ist bei einem echten Rnd() mit großen Zahlen die Wahrscheinlichkeit 1:1, daß die Zahl größer oder kleiner ist, als 4^16 : 2.
In iFs Beispiel ist die Wahrscheinlichkeit aber schon 10:1, daß die Zahl 10-stellig ist (4^16 ist übrigens 10- und nicht 12-stellig).
Ähnliches gilt für Franks (verschwundenes) Beispiel.
Hat jemand ne Idee, wie ich das angehen könnte? Oder könnte das sogar in Profan eingebaut werden? Ist wahrscheinlich ne fest verdrahtete Delphilösung, oder?
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
11.12.2007  
 




Michael
Wodrich
Selbst stricken - Beispiel
KompilierenMarkierenSeparieren
Declare Zufall_Save!, Zufall_Obergrenze!

Proc Zufall

    Declare x1!,x2!
    x1! = (Zufall_Save! * 65539)
    x2! = Round((x1! / Zufall_Obergrenze! - 0.5),0) * Zufall_Obergrenze!
    Zufall_Save! = x1! - x2!
    Return Zufall_Save!

EndProc

Declare x!
Zufall_Obergrenze! = (4.0^16) - 1
Zufall_Save! = 7

repeat

    cls
    print obergrenze.:, format$(#,0,Zufall_Obergrenze!),    WaitKey: 13 = Enter = weiter, sonst Ende
    print save.......:, format$(#,0,Zufall_Save!)
    print
    print die Zufallszahl;tab(45);Kontrollwert (Max - Zufall)

    whileloop 20

        x! = zufall()
        print x=,format$(#,0,Round(x!-0.5,0));tab(45);format$(#,0,Round(Zufall_Obergrenze! - x! - 0.5,0))

    endwhile

    waitkey

until %key <> 13

end

Über die Verteilung kann ich aber nichts sagen - bin kein Mathematiker

Schöne Grüße
Michael Wodrich
 
Programmieren, das spannendste Detektivspiel der Welt.
11.12.2007  
 




Frank
Abbing

Seltsam - warum taucht denn Franks Beitrag nur hier auf:


Vielleicht weil ich mein Posting wieder gelöscht hatte? Ich fand die Methode später schlecht, weil der Umweg über einen Bereich ja gar nicht nötig ist ist.
 
11.12.2007  
 




RGH
Jörg Sellmeyer
Gibt es eine Möglichkeit eine Zufallszahl aus einem Bereich jenseits der Longgrenze zu ermitteln.

Wenn ich
Var n! = 4^16
Print Rnd(n!)
verwende, kommt nur 0 raus. Gibts da was per Api oder so?
Gruß
Jörg


Warum nimmst Du nicht einfach zufall! = rnd(4^8) * rnd(4^8)?
Das Ergebnis ist immer >= 0 und < 4^16.

Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
11.12.2007  
 




RGH
Pardon:
Eine bessere (korrekte) Verteilung der Zufallszahlen bekommt man natürlich mit:
KompilierenMarkierenSeparieren
Zufall! = 4^(rnd(8)+1) * rnd(4^8)

Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
11.12.2007  
 




RGH
... und ab der nächsten XProfan-Version gibt es auch den Sonderfall Rnd(), der bislang nicht möglich war. Das Ergebnis ist dann ein Flloatwert >= 0 und < 1. Dann löst Du Dein Problem einfach mit:
KompilierenMarkierenSeparieren
zufall! = rnd() * 4^16

Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
11.12.2007  
 




Jörg
Sellmeyer
Sehr schön! Alle kombinierten Werte sind nämlich irgendwie gemauschelt und entsprechen nicht der tatsächlichen Wahrscheinlichkeit.
Läßt sich hier sehr leicht nachvollziehen:
KompilierenMarkierenSeparieren
 $H Windows.ph
Set(Decimals,0)
Window 300,10 - 800,1010
Cls
SetDialogFont ~GetStockobject($11)
Declare z!,l&,l1&,l2&,z$,i%,i1%,i2%
l&= Create(ListBox,%hwnd,1,10,10,180,Height(%hwnd)-20)
l1&= Create(ListBox,%hwnd,1,212,10,180,Height(%hwnd)-20)
l2&= Create(ListBox,%hwnd,1,414,10,180,Height(%hwnd)-20)

WhileLoop 20670

    Randomize
    z$=Format$(0000000000,Rnd($7fffffff) + Rnd($7fffffff))

    If Left$(z$,2)= 00

        Inc i%

    EndIf

    Case SelectString(l&,-1,z$) = -1:AddString(l&, z$)
    z$=Format$(00000,Rnd(256^2))

    If Left$(z$,2)= 00

        Inc i1%

    EndIf

    Case SelectString(l1&,-1,z$) = -1:AddString(l1&, z$) +   + Format$(0000000000,Rnd(256^2))
    z$=Format$(00000,(Rnd(256)+1) * Rnd(256))

    If Left$(z$,2)= 00

        Inc i2%

    EndIf

    Case SelectString(l2&,-1,z$) = -1:AddString(l2&, z$) +   + Format$(0000000000,Rnd(256^2))
    WindowTitle Str$(i%) +   + Str$(i1%) +   + Str$(i2%) +   + Str$(&Loop)

Wend

waitkey
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
11.12.2007  
 



RGH
... und ab der nächsten XProfan-Version gibt es auch den Sonderfall Rnd(), der bislang nicht möglich war. Das Ergebnis ist dann ein Flloatwert >= 0 und < 1. Dann löst Du Dein Problem einfach mit:
KompilierenMarkierenSeparieren
zufall! = rnd() * 4^16

Gruß
Roland


Jau das ist super!

@Jörg: Du greifst damit auf einen vergänglichen BeitragsCache zu, Frank hatte seinen Beitrag gelöscht.
 
11.12.2007  
 




Jörg
Sellmeyer
Diese neue Möglichkeit ist in der Hilfe gar nicht erwähnt!
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
07.08.2008  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

4.749 Betrachtungen

Unbenanntvor 0 min.
RudiB.17.05.2020
Pauli15.04.2013
Jörg Sellmeyer13.11.2011

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie