Oscar ha scritto:
> A1:A100 =casuale()
> B1:B100 =RANGO(A1;$A$1:$A$100)
> C1:C100 =SEGNO(CONTA.SE(B$1:B$100;B1)-1) ...
> continuo a trovare doppioni; e aggiungo con molta facilità.
La spiegazione di tutto e' che in ambiente Microsoft Windows (sotto
spiego meglio, in realta' e' il compilatore che fa la differenza) il
generatore di numeri casuali di Calc e' fortemente limitato. Esistono
solo (sono pochi!) 32768 numeri "casuali", per la precisione:
0/32768, 1/32768..., 32767/32768.
Per verificare, basta scrivere:
A1: [=CASUALE()]
B1: [=A1*32768]
C1: [=B1-ARROTONDA.DIFETTO(B1;1)]
Se la cella C1 rimane sempre a zero anche aggiornando piu' volte con
CTRL-SHIFT-F9, la vostra versione di Calc e' stata compilata con questo
supporto limitato per i numeri casuali.
Questo spiega tutto:
- Con solo 32768 numeri a disposizione, e' relativamente facile trovare
dei doppioni in un elenco di 100 chiamate consecutive (indipendenti o
no); se 100 vi sembra molto piccolo rispetto a 32768, cercate
informazioni sul "paradosso dei compleanni".
- Moltiplicare CASUALE()*CASUALE() distrugge varie proprieta'
statistiche, ma aumenta l'insieme dei risultati ottenibili, che
diventano parecchi milioni. Quindi cala di molto la probabilita' di
trovare collisioni, o "doppioni".
E' un bug di OOo? No, il codice di OOo rimanda la scelta al compilatore:
sc/source/core/tool/interpr1.cxx
void ScInterpreter::ScRandom() {
PushDouble((double)rand() / ((double)RAND_MAX+1.0));
}
Di qui si nota che il denominatore e' RAND_MAX+1. RAND_MAX dipende dal
compilatore che usate:
- Microsoft Visual Studio usa RAND_MAX=32767, quindi se OOo e' stato
compilato con quello avrete a disposizione solo 32768 numeri casuali.
http://msdn.microsoft.com/en-us/library/2dfe3bzd(VS.80).aspx
- GNU GCC (C++) usa RAND_MAX=2147483647, quindi se OOo e' stato
compilato con quello avrete a disposizione oltre 2 miliardi di numeri
casuali e le collisioni saranno eventi assolutamente eccezionali.
http://www.gnu.org/software/libc/manual/html_node/ISO-Random.html
La differenza tra compilatori spiega anche l'ultimo mistero rimasto,
cioe' perche' il problema si manifesta solo per utenti Microsoft
Windows.
Ciao,
Andrea.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]