Dimostrare il teorema centrale della statistica

sc0rp1on
'Realizzare un programma in VB6 tale che dimostri il teorema centrale della statistica
'Dati in input:
' 1 estrarre una popolazione minimo 2 max 6 elementi in modo randomatico con un campo di variazione da 1 a 100
' 2 estrarre un campione in modo bernoulliano e in blocco di ampiezza 2
' dopo di che output:
' 3 il programma deve calcolare scarto, media e varianza della popolazione
' 4 estrarre in spazi campionari
' 5 estrarre gli spazi campionari della media campionaria


chi mi spiega come farlo? non voglio sapere il codice ma solo come procedere! per esempio chi mi spiega i punti 2, 3, 4 e 5??

Risposte
itpareid
già ho difficoltà ad interpretare la prima riga: un programma che dimostra??? poi il teorema centrale della statistica??? (forse teorema centrale del limite?)

DemoneRoss
si può sapere dove hai trovato un esercizio simile?
(tu l'hai proprio trovato scritto così?)

so che esiste un gruppo di ricercatori che ha messo a punto un programma in grado di dedurre le leggi newtoniane semplicemente osservando l'andamento degli astri nel cielo (non garantisco che sia vero, ma mi sembrava di averlo letto sulle scienze, potrei anche ricordare questi'informazione in maniera differente da come l'avevo lettta), ma ricavarsi una legge non so se sia l'equivalente di una dimostrazione matematica (anche perchè se fosse possibile i matematici farebbero fare tutto ai computer e se ne starebbero seduti in attesa di scoprire la nuova formula del secolo :) )

forse l'esercizio deve solamente verificare i risultati teorici generando valori random?

A questo punto io potrei dirti che è impossibile.

I computer sono in grado di generare solo numeri pseudocasuali. Per generare questi numeri vengono usati vari algoritmi che hanno distribuzioni più o meno uniformi all'interno di un intervallo (generalmente l'intervallo è 0.. 4.000.000.000 circa)


Se ad esempio tu provi ad usare la funzione rand() per fare i lanci di un dado e fai 10000 lanci in automatico , vedrai che la media
dei lanci viene qualcosa come 3,1 o 2,9 invece che un numero vicino a 3,5.(il valore esatto è 3.5)

(ho provato qualche giorno fa sulla mia macchina per motivi diversi).

cenzo1
"DemoneRoss":
Se ad esempio tu provi ad usare la funzione rand() per fare i lanci di un dado e fai 10000 lanci in automatico , vedrai che la media dei lanci viene qualcosa come 3,1 o 2,9 invece che un numero vicino a 3,5.(il valore esatto è 3.5)

(ho provato qualche giorno fa sulla mia macchina per motivi diversi).

Sulla mia macchina il generatore di numeri (pseudo)casuali non ha problemi (*)

dado<-function(prove) {
  somma<-0
  for (i in 1:prove) {
    somma<-somma+sample(6,1)
  }
  somma/prove
}

> dado(10000)
[1] 3.5314
> dado(100000)
[1] 3.49209
> dado(1000000)
[1] 3.499556


Se quello che dici fosse vero, tutte le simulazioni che si fanno in numerosi ambiti scientifici, sarebbero tutte da buttare a mare.... :roll:

(*) La qualità di un generatore di numeri casuali può essere valutata con i Diehard tests

DemoneRoss
dipende da quale programma software usi 8-)

ovvio che se usi matlab, ci sarà un ottimo pseudo-ranodmizzatore (e figuriamoci se non lo mettono in un software matematico così rinomato e costoso).

se invece usi la funzione C++ che trovi in



ovvero

rand();

avrai brutte sorprese.


come dicevo ho avuto modo di sperimentare diverse funzioni pseudo-casuali qualche giorno fa.
Ho usato i test DieHard citati anche da te, ma non solo. Ho usato quei test ma anche
altri test più semplici (il dado era uno di quelli, generazione di immagini noised
per la ricerca di artefatti visivi)

delle 29 funzioni pseudocasuali testate solo 3 hanno superato tutti i test:

algoritmo xorshift di marsaglia.
una mia variante allo xorshift
un'altro algoritmo che sfrutta il supporto di cifrari da diversi kilobyte (dichiarato crittograficamente sicuro,peccato che fosse abbastanza lento da essere scartato per applicazioni real-time).

tra gli algoritmi da scartare a priori ci sono:
rand() (funzione standard del c/c++)
mersenne twister a 32 bit (mi riferisco solo alle varianti di vari utenti, l'originale è buono ).

cenzo1
"DemoneRoss":
dipende da quale programma software usi 8-)

ovvio che se usi matlab, ci sarà un ottimo pseudo-ranodmizzatore (e figuriamoci se non lo mettono in un software matematico così rinomato e costoso).

Certo, ma non ho usato Matlab, bensì l'ottimo (ed opensource) R, che di default usa il Mersenne-Twister (ma mette a diposizione anche altri metodi, tra cui il Marsaglia-Multicarry).
Va bene che il Mersenne-Twister non è adatto per applicazioni crittografiche, ma per le necessità dell'utente che ha aperto il topic andrà benissimo.

Per il rand() non so, non uso il C++, ma se come dici fornisce quelle medie sul lancio di 10000 dadi, allora è da evitare... :wink:

Rggb1
Effettivamente è un po' OT. Comunque è logico che le funzioni pseudocasuali tipo rand() implementate nelle librerie standard (C et al) non siano adatte ad una generazione "reale" o di simulazione del reale, non sono nate per questo. Figurati che di recente mi è capitato di fare una simulazione e - abbastanza sorprendentemente - una funzione del genere non è adeguata nemmeno per una cosa così semplice ("mischiare le carte"):
https://www.matematicamente.it/forum/pos ... tml#432092

@sc0rp1on
E' effettivamente quello il testo del problema? Potresti eventualmente fornire qualche altra indicazione, ché è abbastanza criptico.

sc0rp1on
la prof di calcolo ci ha dettato la traccia.. il linguaggio di programmazione è visual basic 6, come ho scritto nella traccia.. la funzione che uso per generare numeri casuali da 1 a 100 è:

Private Sub estrazioneElementi(fine As Integer)
Dim n As Integer
For i = 0 To fine
    Randomize
    n = ((Rnd() * 99))
    lblElemento(i).Caption = Str(n)
    lblElemento(i).ToolTipText = lblElemento(i).Caption
Next i
End Sub


come ho scritto nel primo post non ho capito bene i punti 2, 3, 4 e 5.

grazie per le risposte =)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.