Italia
Foro

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?
Saluto
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
string s

whileloop 12 {s=s+str$(rnd(10))}

float f=val(s)/pre>
 
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 grande 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 per Franks (verschwundenes) Beispiel.
Hat jemand ne Idee, wie ich das angehen potuto? Oder potuto 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 circa 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?
Saluto
Jörg


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

Saluto
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 naturalmente mit:
KompilierenMarkierenSeparieren
Zufall! = 4^(rnd(8)+1) * rnd(4^8)
>

Saluto
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 finora nicht possibile war. Das Ergebnis ist dann ein Flloatwert >= 0 und < 1. Dann löst Du Dein Problem einfach mit:
KompilierenMarkierenSeparieren
zufall! = rnd() * 4^16
>

Saluto
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 finora nicht possibile war. Das Ergebnis ist dann ein Flloatwert >= 0 und < 1. Dann löst Du Dein Problem einfach mit:
KompilierenMarkierenSeparieren
zufall! = rnd() * 4^16
>

Saluto
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 Aiuto gar nicht erwähnt!
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
07.08.2008  
 




Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

4.731 Views

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

Themeninformationen



Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


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