Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Random non random...

  1. #1
    Utente di HTML.it L'avatar di barney09
    Registrato dal
    Dec 2000
    Messaggi
    1,296

    Random non random...

    Il random è in realta uno pseudo random. Qual è il metodo piu' affidabile per generare dei numeri casuali?

    Questo è quello che mi è successo e come ho risolto il problema. In ogni caso il risultato non mi convince pienamente...

    Utilizzando questo script, e importando il risultato in un db access, contando i duplicati, mi è uscito un risultato simile a questo

    1= 15% circa
    2= 30% circa
    3= 30% circa
    4= 15% circa

    ecco il codice:

    codice:
    <%
    i = 0
    While not i > 10000
    
    	Randomize()
    	Nrandom = CInt((4 - 1)*Rnd() + 1 )
    	
    	Response.Write "
    " & Nrandom
    
    i = i + 1
    WEND
    %>
    allora ho applicato il seguente "correttivo" per portare il risultato dei "grandi numeri" su delle cifre piu' accettabili:
    codice:
    <%
    i = 0
    While not i > 10000
    
    	Randomize()
    	Nrandom = CInt((5 - 1)*Rnd() + 1 )
    	
    	'correttivo 
    	If Nrandom = 5 THEN
    		Nrandom = 1
    	END IF
    
    	Response.Write "
    " & Nrandom
    
    i = i + 1
    WEND
    %>

    Infatti così facendo sono riuscito a grandi linee a ridistribuire euqamente la casualità di 10000 estrazioni su 4 numeri, avvicinandomi a quello che dovrebbe a grandi linee essere 25% per numero.

    Questo è uno dei test effettuati con il correttivo.

    Valore - NumDuplicati
    1 - 1995
    2 - 2651
    3 - 2737
    4 - 2618

    Nonostante il correttivo il caso 1 è parecchio (oltre il 20%) sotto la media (che dovrebbe essere circa 2500)


    La legge dei grandi numeri non è una scenza esatta, pero' la differenza di piu' del 20 % mi sembra TROPPA

  2. #2
    Utente di HTML.it L'avatar di barney09
    Registrato dal
    Dec 2000
    Messaggi
    1,296
    capita a volte che ci siano degli sbalzi così evidenti (anche oltre il 20 %) mentre altre volte la legge dei grandi numeri viene rispettata e SEMBRA che il random funzioni correttamente...


    1 - 2320
    2 - 2731
    3 - 2584
    4 - 2366

  3. #3
    il problema non sta nella funzione di generazione dei numeri casuali di vb, ma nello script che hai utilizzato per fare le prove.

    prendiamo il primo che hai postato. prima del casting ad intero, il risultato di

    (4 - 1)*Rnd() + 1

    può restituirti un numero "double" che va da 1 a 4
    ora, se provi a fare il CInt di un numero double vedrai che:
    CInt(1) = 1
    CInt(1.49) = 1
    CInt(1.51) = 2
    CInt(2.49) = 2
    CInt(2.51) = 3
    CInt(3.49) = 3
    CInt(3.51) = 4
    CInt(4) = 4

    è evidente che la probabilità di verificarsi di 1 e di 4 sono molto più basse di quelle di 2 e 3.
    il tuo secondo script ha un problema fondato sulla medesima tecnica di arrotondamento.

    ora prova questo:

    codice:
    <%
    function upper(n)
    	dim ris
    	
    	if CDbl(n) > fix(n) then
    		ris = Fix(n) +1
    	else
    		ris = Fix(n)
    	end if
    	
    	upper = ris
    end function
    
    dim i, risultati(3), valore, numeri, elementiArr, frequenze
    dim mDistr, mCamp
    
    elementiArr = UBound(risultati)
    
    for i=0 to elementi
    	risultati(i) = 0
    next 'i
    
    numeri = elementiArr +1
    for i=1 to 10000
    	Randomize()
    	
    	valore = upper(numeri * Rnd())
    	
    	risultati(valore -1) = risultati(valore -1) +1
    next 'i
    
    
    mDistr		= 0
    mCamp		= 0
    frequenze	= 0
    
    for i=0 to elementiArr
    	Response.Write (CStr(i +1) & " freq. --> " & CStr(risultati(i)))
    	Response.Write ("
    ")
    	
    	mDistr		= mDistr + (i +1)
    	mCamp		= mCamp + (i +1) * risultati(i)
    	frequenze	= frequenze + risultati(i)
    next 'i
    
    Response.Write ("
    Media Campionaria: " & CStr(CDbl(mCamp) / frequenze) )
    Response.Write ("
    Media della distribuzione: " & CStr(CDbl(mDistr) / (elementiArr +1)) )
    %>
    vedrai che i risultati confutano la legge dei grandi numeri (ossia che al crescere delle osservazioni la media campionaria tende alla media della distribuzione)



    NB: anche il mio script ha un problema, nel senso che a causa dello zero la probabilità di verificarsi del primo numero della serie è leggermente più alta. per ottenere una perfetta equidistribuzione delle probabilità sarebbe sufficiente per esempio escludere le osservazioni dove rnd() restituisce zero
    xxx

  4. #4
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    Nella formula originale e' sufficiente una piccola correzione:

    Nrandom = CInt(4 * Rnd() + 0.5 )

    ciao
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  5. #5
    Originariamente inviato da br1
    Nella formula originale e' sufficiente una piccola correzione:

    Nrandom = CInt(4 * Rnd() + 0.5 )

    ciao
    mitico
    xxx

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.