Numeri (quasi) casuali...
Moderatore: Staff
Regole del forum
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
- EmaDaCuz
- Linux 3.x

- Messaggi: 877
- Iscritto il: sab 28 gen 2006, 15:47
- Slackware: 12.0 - ma a Trieste
- Kernel: 2.6.25
- Desktop: Fluxbox
- Distribuzione: Debian e Arch
- Località: Nijmegen, NL
- Contatta:
Numeri (quasi) casuali...
Forse il thread sarebbe piu' adatto alla sezione "Programmazione", ma intanto posto qui.
Per motivi didattici, mi piacerebbe creare delle curve simil-campana partendo generate da numeri quasi casuali.
Dico quasi casuali perche' mi piacerebbe che venissero rispettati dei limiti:
-dovrei scegliere il numero di elementi
-scegliere la moda
-scegliere la mediana
-scegliere l'intervallo entro cui la "campana" si sviluppa.
E' possibile ottenere quello che desidero (bastano i dati, la curva la otterei via GNUPlot o foglio di calcolo) con qualche script o qualche programmino? Io non ho assolutamente idea da dove partire...
Grazie per ogni eventuale interessamento.
Per motivi didattici, mi piacerebbe creare delle curve simil-campana partendo generate da numeri quasi casuali.
Dico quasi casuali perche' mi piacerebbe che venissero rispettati dei limiti:
-dovrei scegliere il numero di elementi
-scegliere la moda
-scegliere la mediana
-scegliere l'intervallo entro cui la "campana" si sviluppa.
E' possibile ottenere quello che desidero (bastano i dati, la curva la otterei via GNUPlot o foglio di calcolo) con qualche script o qualche programmino? Io non ho assolutamente idea da dove partire...
Grazie per ogni eventuale interessamento.
- riotten
- Linux 1.x

- Messaggi: 185
- Iscritto il: mer 6 giu 2007, 16:05
- Slackware: 13.37
- Desktop: Fluxbox
- Località: Udine
Re: Numeri (quasi) casuali...
c'è un capitolo che potrebbe tornarti utile nel libro "algorithms in c" by sedgewick.....
- joe
- Iper Master

- Messaggi: 3986
- Iscritto il: ven 27 apr 2007, 11:21
- Slackware: 15.0
- Kernel: 5.15.38
- Desktop: dwm
Re: Numeri (quasi) casuali...
In passato ho visto qualcosa del genere fatto in fortran, mi pare che si parlasse di "metodo montecarlo":
generi una serie di numeri casuali compresi tra 0 e 1, in pratica sono probabilità...si generano nel modo più casuale possibile usando se non ricordo male una funzione chiamata random_seed o qualcosa del genere, mi spiace ma non ricrdo di preciso...prova con google per maggiori info (cercando i termini di cui ho parlato).
Una volta che hai questa serie di numeri li sbatti nella funzione di probabilita cumulata relativa alla tua campana per capirci (mi sono spiegato?). Cioè ciascun numero rappresenta un valore della F(xi). Genericamente hai F(xi)=F(xi, a, b, c, ...n) dove a, b, c, .., n sono i parametri checaratterizzano la tua campana (per esempio la tua gaussiana, la tua gumbel o altre funzioni del genere.
Praticamente a te serve la formula xi=F^(-1)(xi), dovresti riuscire a ricavartela in qualche modo. (ripeto sto andando a braccio e può essere che amemoria non ricordi alcuni aspetti necessari).
Alla fine della fiera trovi una serie di xi che sono distribuiti secondo la tua funzione di densità di probabilità f(x,a,b,c,...n): come saprai il legametra F e f è noto F(xi)=int[f(x)]|,calcolato tra -infinito e xi (sempre andando a memoria...).
Quindi a matita o sbirciando in qualche appunto/libro/sito/ecc determini la F(x,a,b...) che poi se hai i parametri a, b, ... noti, è di fatto "F(x)".
Poi sempre a matita ricavi l'inversa x=F^-1[F(x)].
A questo punto passi alla programmazione:
- produci con random seed i valori casuali (completamente casuali eh) di F(x)
- ricavando per ognuno il valore della variabile casuale xi
- la serie di xi ottenuta sarà distribuita secondo la tua campana da cui eri partito.
Prendi tutto con le pinze ma teoricamente il discorso dovrebbe essere quello.
Prova anche la chiave di ricerca:
random seed metodo monte carlo generazione numeri casuali
generi una serie di numeri casuali compresi tra 0 e 1, in pratica sono probabilità...si generano nel modo più casuale possibile usando se non ricordo male una funzione chiamata random_seed o qualcosa del genere, mi spiace ma non ricrdo di preciso...prova con google per maggiori info (cercando i termini di cui ho parlato).
Una volta che hai questa serie di numeri li sbatti nella funzione di probabilita cumulata relativa alla tua campana per capirci (mi sono spiegato?). Cioè ciascun numero rappresenta un valore della F(xi). Genericamente hai F(xi)=F(xi, a, b, c, ...n) dove a, b, c, .., n sono i parametri checaratterizzano la tua campana (per esempio la tua gaussiana, la tua gumbel o altre funzioni del genere.
Praticamente a te serve la formula xi=F^(-1)(xi), dovresti riuscire a ricavartela in qualche modo. (ripeto sto andando a braccio e può essere che amemoria non ricordi alcuni aspetti necessari).
Alla fine della fiera trovi una serie di xi che sono distribuiti secondo la tua funzione di densità di probabilità f(x,a,b,c,...n): come saprai il legametra F e f è noto F(xi)=int[f(x)]|,calcolato tra -infinito e xi (sempre andando a memoria...).
Quindi a matita o sbirciando in qualche appunto/libro/sito/ecc determini la F(x,a,b...) che poi se hai i parametri a, b, ... noti, è di fatto "F(x)".
Poi sempre a matita ricavi l'inversa x=F^-1[F(x)].
A questo punto passi alla programmazione:
- produci con random seed i valori casuali (completamente casuali eh) di F(x)
- ricavando per ognuno il valore della variabile casuale xi
- la serie di xi ottenuta sarà distribuita secondo la tua campana da cui eri partito.
Prendi tutto con le pinze ma teoricamente il discorso dovrebbe essere quello.
Prova anche la chiave di ricerca:
random seed metodo monte carlo generazione numeri casuali
- giberg
- Linux 4.x

- Messaggi: 1282
- Iscritto il: mer 21 set 2005, 17:28
- Nome Cognome: Gianni
- Slackware: current64
- Kernel: 3.7.1
- Desktop: 4.8.5
- Località: S. Biagio di Callalta (TV)
Re: Numeri (quasi) casuali...
Intendi generare numeri pseudocasuali daEmaDaCuz ha scritto:Forse il thread sarebbe piu' adatto alla sezione "Programmazione", ma intanto posto qui.
Per motivi didattici, mi piacerebbe creare delle curve simil-campana partendo generate da numeri quasi casuali.
Dico quasi casuali perche' mi piacerebbe che venissero rispettati dei limiti:
-dovrei scegliere il numero di elementi
-scegliere la moda
-scegliere la mediana
-scegliere l'intervallo entro cui la "campana" si sviluppa.
E' possibile ottenere quello che desidero (bastano i dati, la curva la otterei via GNUPlot o foglio di calcolo) con qualche script o qualche programmino? Io non ho assolutamente idea da dove partire...
Grazie per ogni eventuale interessamento.
delle particolari distribuzioni da quanto ho capito,
come ad esempio una Normale (Gaussiana)?
R (r-project tra i pacchetti slacky) ha le funzioni
già pronte per generare numero pseudocasuali
da varie distribuzioni. Ad esempio per generare
numeri da una normale hai la funzione
rnorm
con rnorm(1000) ad esempio generi 1000 numeri
da una Normale standard (media 0, deviazione standard 1).
Ovviamente puoi passare i valori che vuoi per media
e deviazione standard.
Poi puoi fare un istogramma e sovrapporci la curva della
normale per vedere "a occhio" se la simulazione è buona
(più numeri generi più l'istogramma prende la forma della
campana).
Se invece devi simulare da una funzione
qualsiasi allora bisogna costruirsi uno script
usando uno dei metodi di simulazione (non
molto difficile da usare ad esempio è
il metodo del rifiuto che permette di appoggiarsi
ad una distribuzione da cui si sanno generare
numeri pseudocasuali).
- lamarozzo
- Linux 3.x

- Messaggi: 732
- Iscritto il: gio 14 lug 2005, 0:00
- Desktop: xfce
- Distribuzione: archlinux
- Località: Roma
Re: Numeri (quasi) casuali...
Sicuramente per campana intendi la guassiana. Per estrarre numeri da una distribuzione gaussiana c'è il metodo box-muller, ecco il codice:
Ogni volta che chiami la funzione ti viene restituito un numero estratto dalla distribuzione normale, media 0 e varianza unitaria. Se vuoi una varianza diversa basta che moltiplichi il numero per la deviazione standard, e se vuoi una media diversa da zero basta che sommi il valore medio desiderato.
La funzione richiama drand48(), quindi assicurati di settare il seed prima di chiamare la funzione con srand48().
Ciao
Codice: Seleziona tutto
double gaussianDistribution()
{
double x1,x2,w,rnumb;
do {
x1=2.*drand48()-1.;
x2=2.*drand48()-1.;
w=x1*x1+x2*x2;
} while (w>=1.);
w=sqrt( (-2.*log(w))/w );
rnumb=x1*w;
return rnumb;
}
La funzione richiama drand48(), quindi assicurati di settare il seed prima di chiamare la funzione con srand48().
Ciao
- giberg
- Linux 4.x

- Messaggi: 1282
- Iscritto il: mer 21 set 2005, 17:28
- Nome Cognome: Gianni
- Slackware: current64
- Kernel: 3.7.1
- Desktop: 4.8.5
- Località: S. Biagio di Callalta (TV)
Re: Numeri (quasi) casuali...
Da quello che ho capitojoe ha scritto:Una volta che hai questa serie di numeri li sbatti nella funzione di probabilita cumulata relativa alla tua campana per capirci (mi sono spiegato?). Cioè ciascun numero rappresenta un valore della F(xi). Genericamente hai F(xi)=F(xi, a, b, c, ...n) dove a, b, c, .., n sono i parametri checaratterizzano la tua campana (per esempio la tua gaussiana, la tua gumbel o altre funzioni del genere.
Praticamente a te serve la formula xi=F^(-1)(xi), dovresti riuscire a ricavartela in qualche modo. (ripeto sto andando a braccio e può essere che amemoria non ricordi alcuni aspetti necessari).
Alla fine della fiera trovi una serie di xi che sono distribuiti secondo la tua funzione di densità di probabilità f(x,a,b,c,...n): come saprai il legametra F e f è noto F(xi)=int[f(x)]|,calcolato tra -infinito e xi (sempre andando a memoria...).
Quindi a matita o sbirciando in qualche appunto/libro/sito/ecc determini la F(x,a,b...) che poi se hai i parametri a, b, ... noti, è di fatto "F(x)".
Poi sempre a matita ricavi l'inversa x=F^-1[F(x)].
quello che descrivi è il metodo
dell'inversione della funzione di
ripartizione di una variabile casuale.
Se hai una variabile casuale continua X
con funzione di ripartizione Fx, se si considera
la variabile casuale trasformata Y=Pr(X<=y)=Fx(y)
allora Y~U(0,1) (cioè uniforme 0,1).
Quindi estrai n numeri da una
uniforme
u_i~U(0,1)
e quindi li trasformi in x_i = F^(-1)(u_i).
Comunque finché si tratta di generare
da variabili casuali, R ha già le funzioni
pronte per estrarre i numeri, non servono
trasformazioni.
- giberg
- Linux 4.x

- Messaggi: 1282
- Iscritto il: mer 21 set 2005, 17:28
- Nome Cognome: Gianni
- Slackware: current64
- Kernel: 3.7.1
- Desktop: 4.8.5
- Località: S. Biagio di Callalta (TV)
Re: Numeri (quasi) casuali...
Come grafico è questo che vuoi ottenere?EmaDaCuz ha scritto: E' possibile ottenere quello che desidero (bastano i dati, la curva la otterei via GNUPlot o foglio di calcolo) con qualche script o qualche programmino? Io non ho assolutamente idea da dove partire...

Srivo qui il codice R per ottenere numeri e grafico
(commenti preceduti da #):
Codice: Seleziona tutto
# genera 1000 numeri pseudocasuali da una normale standard
numeri<-rnorm(1000)
# anziché aprire una finestra grafica, l'istogramma con il comando jpeg
# viene salvato in un jpeg (altrimenti si può usare png, pdf...)
jpeg(file="istogramma.jpeg")
# genera l'istogramma con le densità (frequency=FALSE, altrimenti mostra le frequenze)
hist(numeri, frequency=FALSE, main="Istogramma di 1000 numeri pseudocasuali\nda una Normale standard")
# aggiungi la curva di una normale standard. Alla funzione curve viene passata la funzione dnorm
curve(dnorm, add=TRUE)
# chiudi il device grafico
dev.off()
ad esempio media=3, deviazione standard=2
allora
rnorm(1000,3,2)
per sicurezza, nel caso ci si dimentichi
dell'ordine dei parametri (di sicuro il primo è
la quantità da generare):
rnorm(1000, mean=3, sd=2)
- EmaDaCuz
- Linux 3.x

- Messaggi: 877
- Iscritto il: sab 28 gen 2006, 15:47
- Slackware: 12.0 - ma a Trieste
- Kernel: 2.6.25
- Desktop: Fluxbox
- Distribuzione: Debian e Arch
- Località: Nijmegen, NL
- Contatta:
Re: Numeri (quasi) casuali...
Fantastico. Ci daro' un' occhiata piu' approfondita appena posso, ma a grandi linee ci siamo.giberg ha scritto:Come grafico è questo che vuoi ottenere?EmaDaCuz ha scritto: E' possibile ottenere quello che desidero (bastano i dati, la curva la otterei via GNUPlot o foglio di calcolo) con qualche script o qualche programmino? Io non ho assolutamente idea da dove partire...
Srivo qui il codice R per ottenere numeri e grafico
(commenti preceduti da #):Se vuoi una gaussiana non standard,Codice: Seleziona tutto
# genera 1000 numeri pseudocasuali da una normale standard numeri<-rnorm(1000) # anziché aprire una finestra grafica, l'istogramma con il comando jpeg # viene salvato in un jpeg (altrimenti si può usare png, pdf...) jpeg(file="istogramma.jpeg") # genera l'istogramma con le densità (frequency=FALSE, altrimenti mostra le frequenze) hist(numeri, frequency=FALSE, main="Istogramma di 1000 numeri pseudocasuali\nda una Normale standard") # aggiungi la curva di una normale standard. Alla funzione curve viene passata la funzione dnorm curve(dnorm, add=TRUE) # chiudi il device grafico dev.off()
ad esempio media=3, deviazione standard=2
allora
rnorm(1000,3,2)
per sicurezza, nel caso ci si dimentichi
dell'ordine dei parametri (di sicuro il primo è
la quantità da generare):
rnorm(1000, mean=3, sd=2)
Grazie mille, non solo a te ma anche agli altri che hanno postato le loro idee.
- giberg
- Linux 4.x

- Messaggi: 1282
- Iscritto il: mer 21 set 2005, 17:28
- Nome Cognome: Gianni
- Slackware: current64
- Kernel: 3.7.1
- Desktop: 4.8.5
- Località: S. Biagio di Callalta (TV)
Re: Numeri (quasi) casuali...
Se serve qualche chiarimentoEmaDaCuz ha scritto: Fantastico. Ci daro' un' occhiata piu' approfondita appena posso, ma a grandi linee ci siamo.
Grazie mille, non solo a te ma anche agli altri che hanno postato le loro idee.
su R chiedi pure.
Una nota al codice scritto sopra:
se vuoi vedere il grafico senza
salvarlo, tanto per vedre come
viene, non scrivere i comandi
jpeg(file="istogramma.jpeg")
e dev.off() (dev.off ti chiuderebbe
la finestra grafica che ti appare a video).
- EmaDaCuz
- Linux 3.x

- Messaggi: 877
- Iscritto il: sab 28 gen 2006, 15:47
- Slackware: 12.0 - ma a Trieste
- Kernel: 2.6.25
- Desktop: Fluxbox
- Distribuzione: Debian e Arch
- Località: Nijmegen, NL
- Contatta:
Re: Numeri (quasi) casuali...
Grazie ancora, non conoscevo R e devo dire che mi ha sorpreso in positivo.
Una sola cosa, approfittando della tua gentilezza...
E' possibile plottare un istogramma con l'asse x in scala logaritmica??? Sto cercando informazioni ma mi sembra che nessuno abbia un metodo "definitivo".
E grazie ancora per la dritta!
Una sola cosa, approfittando della tua gentilezza...
E' possibile plottare un istogramma con l'asse x in scala logaritmica??? Sto cercando informazioni ma mi sembra che nessuno abbia un metodo "definitivo".
E grazie ancora per la dritta!
- giberg
- Linux 4.x

- Messaggi: 1282
- Iscritto il: mer 21 set 2005, 17:28
- Nome Cognome: Gianni
- Slackware: current64
- Kernel: 3.7.1
- Desktop: 4.8.5
- Località: S. Biagio di Callalta (TV)
Re: Numeri (quasi) casuali...
Quello che ti interessa è
trasformare i numeri nel loro
logaritmo?
trasformare i numeri nel loro
logaritmo?
- EmaDaCuz
- Linux 3.x

- Messaggi: 877
- Iscritto il: sab 28 gen 2006, 15:47
- Slackware: 12.0 - ma a Trieste
- Kernel: 2.6.25
- Desktop: Fluxbox
- Distribuzione: Debian e Arch
- Località: Nijmegen, NL
- Contatta:
Re: Numeri (quasi) casuali...
Non proprio, per quello da quanto ho capito basta l<-log(x).
Semplicemente, mi piacerebbe avere una scala logaritmica sull'asse x... e non sembra una cosa banale!
Comunque grazie, piu' mi inoltro nel programma e piu' mi piace.
Semplicemente, mi piacerebbe avere una scala logaritmica sull'asse x... e non sembra una cosa banale!
Comunque grazie, piu' mi inoltro nel programma e piu' mi piace.
- giberg
- Linux 4.x

- Messaggi: 1282
- Iscritto il: mer 21 set 2005, 17:28
- Nome Cognome: Gianni
- Slackware: current64
- Kernel: 3.7.1
- Desktop: 4.8.5
- Località: S. Biagio di Callalta (TV)
Re: Numeri (quasi) casuali...
Che grafico stai cercando di fare?
Non l'ho mai usato ma c'è un parametro
da usare nella funzione plot.
Esempio: plot(1:12, log="x")
L'ho scoperto dal manuale della funzione
par che viene usata o per impostare
dei paremetri grafici o per vedere quelli
in uso. Infatti par("xlog") restituisce FALSE
se x non è nella scala logaritmica, TRUE altrimenti.
Dice di vedere il parametro log nella funzione
plot.default (quella richiamata quando si usa
la funzione plot su un oggetto).
Per vedere gli help delle funzioni:
?plot.defalut
?par
Nel sito http://cran.r-project.org/
prova a vedere tra la documentazione
"Contributed" se trovi qualcosa che riguarda
la creazione di grafici.
Un mio compagno di università so che aveva
trovato da qualche parte una guida completa
se riesco a rintracciarlo gli chiedo dove.
Non l'ho mai usato ma c'è un parametro
da usare nella funzione plot.
Esempio: plot(1:12, log="x")
L'ho scoperto dal manuale della funzione
par che viene usata o per impostare
dei paremetri grafici o per vedere quelli
in uso. Infatti par("xlog") restituisce FALSE
se x non è nella scala logaritmica, TRUE altrimenti.
Dice di vedere il parametro log nella funzione
plot.default (quella richiamata quando si usa
la funzione plot su un oggetto).
Codice: Seleziona tutto
log: a character string which contains '"x"' if the x axis is to
be logarithmic, '"y"' if the y axis is to be logarithmic and
'"xy"' or '"yx"' if both axes are to be logarithmic.
?plot.defalut
?par
Nel sito http://cran.r-project.org/
prova a vedere tra la documentazione
"Contributed" se trovi qualcosa che riguarda
la creazione di grafici.
Un mio compagno di università so che aveva
trovato da qualche parte una guida completa
se riesco a rintracciarlo gli chiedo dove.
- giberg
- Linux 4.x

- Messaggi: 1282
- Iscritto il: mer 21 set 2005, 17:28
- Nome Cognome: Gianni
- Slackware: current64
- Kernel: 3.7.1
- Desktop: 4.8.5
- Località: S. Biagio di Callalta (TV)
Re: Numeri (quasi) casuali...
Forse plottando la densità anziché
l'istogramma...
prova:
plot(density(numeri),log="x")
è questo ciò che volevi?
l'istogramma...
prova:
plot(density(numeri),log="x")
è questo ciò che volevi?
- giberg
- Linux 4.x

- Messaggi: 1282
- Iscritto il: mer 21 set 2005, 17:28
- Nome Cognome: Gianni
- Slackware: current64
- Kernel: 3.7.1
- Desktop: 4.8.5
- Località: S. Biagio di Callalta (TV)
Re: Numeri (quasi) casuali...
Penso ti possano servire queste slide
che ho trovato proprio ora:
http://csg.sph.umich.edu/docs/R/graphics-1.pdf
C'è una slide che spiega proprio come
fare per avere gli assi in scala logaritmica
(come ti ho mostrato nel post precedente).
Poi trovi vari esempi di grafici, sia fatti tramite
la libreria graphics (quella che stai usando ora
e caricata di default) sia con la libreria lattice.
Se vuoi vedere esempi di grafici:
demo(graphics)
oppure carica la libreria lattice
library(lattice)
demo(lattice)
Puoi anche visualizzare gli esempi
che trovi alla fine degli help delle varie
funzioni. Ad esempio
example(plot)
visualizza i grafici con i codici di esempio
nella guida di plot.
altri che posso consigliarti:
example(plot.default)
example(par)
example(hist)
example(curve)
example(points)
che ho trovato proprio ora:
http://csg.sph.umich.edu/docs/R/graphics-1.pdf
C'è una slide che spiega proprio come
fare per avere gli assi in scala logaritmica
(come ti ho mostrato nel post precedente).
Poi trovi vari esempi di grafici, sia fatti tramite
la libreria graphics (quella che stai usando ora
e caricata di default) sia con la libreria lattice.
Se vuoi vedere esempi di grafici:
demo(graphics)
oppure carica la libreria lattice
library(lattice)
demo(lattice)
Puoi anche visualizzare gli esempi
che trovi alla fine degli help delle varie
funzioni. Ad esempio
example(plot)
visualizza i grafici con i codici di esempio
nella guida di plot.
altri che posso consigliarti:
example(plot.default)
example(par)
example(hist)
example(curve)
example(points)