Newsgroup: it.comp.lang.visual-basic
Titolo: Numeri casuali grandi

Come da subject, se volessi numeri pseudo-casuali tra 1 e N con N
dell'ordine di grandezza dei long ?
Grazie a chiunque risponda.

 dell'ordine di grandezza dei long ?
Fix(Rnd*10^15)

> dell'ordine di grandezza dei long ?
A proposito, la guida di Rnd cita questa chicca:
Int((limitesup - limiteinf + 1) * Rnd + limiteinf)
Anche tu senza guida o ... solo pigro?



No. E' che, da qualche parte (sto cercando disperatamente la fonte) ho
letto che Rnd restituisce un decimale tra 0 e 1 a sole 5 cifre di
precisione e quindi per numeri grandi la casualita' va a farsi
benedire....

 benedire....
Non mi sono mai posto il problema per numeri cosi' grandi, ma se
effettivamente ci fosse il limite suddetto puoi fare una routine che genera
due numeri random interi, ne moltiplica uno per 10.000 e li somma... o
qualcosa del genere
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 benedire....
Hai provato a mettere limiteinf=1 e limitesup=10^15?

benedire....
Ecco un problema che non mi ero ancora posto ;-)
Ed ecco che cosa ho scoperto nella finestra di verifica:
?Rnd()
 0.2895625 
?CSng(Rnd())
 0.301948 
?Cdbl(Rnd())
 0.774740099906921 
?CDec(Rnd())
 0.01401764 
Lascio al lettore le ovvie conclusioni.
-- 
ciao, hal

 Lascio al lettore le ovvie conclusioni.
hai i regional settings USA :))))
--
Silv;o)

hai i regional settings USA :))))
LOLLONE :-DDDD
-- 
ciao, hal

 Lascio al lettore le ovvie conclusioni.
Interessante. Propongo anche questo:
m = 1       'Provare anche con 10 ^ 15
Debug.Print
Debug.Print Rnd(-1) * m
Debug.Print CSng(Rnd(-1) * m)
Debug.Print CDbl(Rnd(-1) * m)
Debug.Print CDec(Rnd(-1) * m)

 Lascio al lettore le ovvie conclusioni.
Rnd di VB è definito come Single (7 cifre significative, 8 se compreso tra 0
e 0.9999999).
Rnd di 
VB.NET
 è un double.
Curiosità: perchè i double di 
VB.NET
 mi accettano una cifra decimale in più
rispetto a VB, pur essendo entrambi IEEE?
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 dell'ordine di grandezza dei long ?
Public Function RndLong(ByVal lLimiteInferiore As Long, _
                 ByVal lLimiteSuperiore As Long) As Long
   Dim lMoltiplicatore As Long
   Dim lLowMoltiplicatore As Long
   Dim lHighMoltiplicatore As Long
   lMoltiplicatore = lLimiteSuperiore - lLimiteInferiore + 1
   If lMoltiplicatore < 2 ^ 16 Then
      lLowMoltiplicatore = (lMoltiplicatore Mod (2 ^ 16) + 1) * Rnd()
      lHighMoltiplicatore = (lMoltiplicatore \ (2 ^ 16) + 1) * Rnd()
      lMoltiplicatore = lHighMoltiplicatore * 2 ^ 16 + lLowMoltiplicatore
   Else
      lMoltiplicatore = (lMoltiplicatore + 1) * Rnd()
   End If
   RndLong = lMoltiplicatore + lLimiteInferiore
End Function
Esempio di chiamata:
Randomize timer
MsgBox RndLong(10000000,100000000)
Ciao
*Roby*

                  ByVal lLimiteSuperiore As Long) As Long
Ehm, sorry, č meglio che non scriva codice alla sera tardi perchč mi viene
male.
Per fortuna stamattina mi č venuto un dubbio...
In effetti avevo sbagliato non sono il codice, ma anche l'esempio di
chiamata.
Quindi lanciandola sembrava funzionare, ma in realtą... :-)
Ecco qui la versione corretta:
Public Function RndLong(ByVal lLimiteInferiore As Long, _
                 ByVal lLimiteSuperiore As Long) As Long
   Dim lValore As Long
   Dim lMoltiplicatore As Long
   Dim dLowMoltiplicatore As Double
   Dim dHighMoltiplicatore As Double
   lMoltiplicatore = lLimiteSuperiore - lLimiteInferiore + 1
   If lMoltiplicatore > 2 ^ 16 Then
      dLowMoltiplicatore = (lMoltiplicatore Mod (2 ^ 16)) * Rnd()
      dHighMoltiplicatore = Int(lMoltiplicatore / (2 ^ 16)) * Rnd()
      lValore = Int(dHighMoltiplicatore * 2 ^ 16 + dLowMoltiplicatore)
   Else
      lValore = lMoltiplicatore * Rnd()
   End If
   RndLong = lValore + lLimiteInferiore
End Function
Con il corretto esempio di chiamata:
   MsgBox (RndLong(10, 100000001))
Ciao
*Roby*