Test del random
Moderatori: Gianfranco, Bruno
Questo forum è una sezione del PORTALE DI BASE CINQUE
Test del random
DIM s(2)
LET s(1)=-1
LET s(2)=1
RANDOMIZE
FOR p=1 TO 1000
LET cont=0
10 FOR m=1 TO 100000
LET x=1+INT(RND*2)
LET y=1+INT(RND*4)
LET cont=cont + s(x)*y
NEXT M
IF ABS(cont)<=3 THEN
PRINT " ";cont
ELSE
PRINT cont
end if
NEXT p
END
Stasera mi è saltato in testa di collaudare il comando RANDOMIZE del Decimal Basic.
Non saprei quanto possa essere ritenuto valido a tali fini l'algoritmo qui sopra, così come concepito, ma il risultato mi ha lasciato abbastanza deluso, tanto più, quanto più alto il valore impostato per il test alla riga 10 ( 100 - 1000 - 10000 - 100000), al crescere del quale maggiore è l'errore riscontrato rispetto al risultato atteso (provare per credere).
Nell'algoritmo il test è stato ripetuto 1000 volte, per meglio controllare la funzionalità e la stabilità del random. I risultati più vicini a quello atteso sono stati posti in maggiore evidenza nella stampa e, come si può notare, su 1000 test, lo zero è veramente raro vederlo. Cosa ne pensate?
LET s(1)=-1
LET s(2)=1
RANDOMIZE
FOR p=1 TO 1000
LET cont=0
10 FOR m=1 TO 100000
LET x=1+INT(RND*2)
LET y=1+INT(RND*4)
LET cont=cont + s(x)*y
NEXT M
IF ABS(cont)<=3 THEN
PRINT " ";cont
ELSE
PRINT cont
end if
NEXT p
END
Stasera mi è saltato in testa di collaudare il comando RANDOMIZE del Decimal Basic.
Non saprei quanto possa essere ritenuto valido a tali fini l'algoritmo qui sopra, così come concepito, ma il risultato mi ha lasciato abbastanza deluso, tanto più, quanto più alto il valore impostato per il test alla riga 10 ( 100 - 1000 - 10000 - 100000), al crescere del quale maggiore è l'errore riscontrato rispetto al risultato atteso (provare per credere).
Nell'algoritmo il test è stato ripetuto 1000 volte, per meglio controllare la funzionalità e la stabilità del random. I risultati più vicini a quello atteso sono stati posti in maggiore evidenza nella stampa e, come si può notare, su 1000 test, lo zero è veramente raro vederlo. Cosa ne pensate?
_________________
$\text { }$ciao ciao
E' la somma che fa il totale (Totò)
$\text { }$ciao ciao
E' la somma che fa il totale (Totò)
-
- Supervisore del sito
- Messaggi: 1723
- Iscritto il: ven mag 20, 2005 9:51 pm
- Località: Sestri Levante
- Contatta:
Re: Test del random
Ciao Pasquale,
Il generatore di numeri casuali potrebbe avere qualche difetto, ma non così eclatante come risulterebbe dalla tua prova.
Tieni presente che se lanci MOLTE volte una moneta, la DIFFERENZA fra le teste e le croci può aumentare illimitatamente mentre il loro RAPPORTO converge a 1.
Nel tuo programma tu calcoli la somma algebrica di una serie di risultati casuali mentre mentre forse sarebbe meglio calcolare la loro media. In effetti la loro somma algebrica aumenta in valore assoluto all'aumentare delle prove mentre la loro media tende a 0 come da aspettative.
Ho modificato il tuo programma così:
Per verificare "a occhio" un generatore di numeri casuali si può fragli riempire un quadrato con punti (pixel) scelti a caso.
Il risultato atteso è che i punti siano distibuiti in modo omogeneo e il DECIMAL lo fa discretamente bene.
Ecco il risultato di questo semplice programmino.
Impostate la "size" della finestra grafica 501x501
Il generatore di numeri casuali potrebbe avere qualche difetto, ma non così eclatante come risulterebbe dalla tua prova.
Tieni presente che se lanci MOLTE volte una moneta, la DIFFERENZA fra le teste e le croci può aumentare illimitatamente mentre il loro RAPPORTO converge a 1.
Nel tuo programma tu calcoli la somma algebrica di una serie di risultati casuali mentre mentre forse sarebbe meglio calcolare la loro media. In effetti la loro somma algebrica aumenta in valore assoluto all'aumentare delle prove mentre la loro media tende a 0 come da aspettative.
Ho modificato il tuo programma così:
Codice: Seleziona tutto
DIM s(2)
LET s(1)=-1
LET s(2)=1
RANDOMIZE
FOR p=1 TO 6
LET cont=0
LET nprove=10^p
FOR m=1 TO nprove
LET x=1+INT(RND*2)
LET y=1+INT(RND*4)
LET cont=cont + s(x)*y
NEXT M
PRINT "n.prove:";nprove;" media:";cont/nprove
NEXT p
END
Il risultato atteso è che i punti siano distibuiti in modo omogeneo e il DECIMAL lo fa discretamente bene.
Ecco il risultato di questo semplice programmino.
Impostate la "size" della finestra grafica 501x501
Codice: Seleziona tutto
SET WINDOW 0,500,0,500
RANDOMIZE
SET POINT STYLE 1
FOR n=1 TO 100000
LET x=1+INT(RND*500)
LET y=1+INT(RND*500)
PLOT POINTS: x,y
NEXT n
END
Pace e bene a tutti.
Gianfranco
Gianfranco
Re: Test del random
Ehi, Gianfranco: potresti simulare $x_1$, $x_2$, $y_1$, $y_2$ e fare il grafico dei segmenti?
il panurgo
Principio di Relatività: $\mathbb{m} \not \to \mathbb{M} \, \Longleftrightarrow \, \mathbb{M} \not \to \mathbb{m}$
"Se la montagna non va a Maometto, Maometto NON va alla montagna"
Principio di Relatività: $\mathbb{m} \not \to \mathbb{M} \, \Longleftrightarrow \, \mathbb{M} \not \to \mathbb{m}$
"Se la montagna non va a Maometto, Maometto NON va alla montagna"
-
- Supervisore del sito
- Messaggi: 1723
- Iscritto il: ven mag 20, 2005 9:51 pm
- Località: Sestri Levante
- Contatta:
Re: Test del random
Intendi questo?
Codice: Seleziona tutto
SET WINDOW 0,320,0,320
SET LINE STYLE 1
RANDOMIZE
LET nlinee=200
FOR n=1 TO nlinee
LET x1=INT(RND*321)
LET y1=INT(RND*321)
LET x2=INT(RND*321)
LET y2=INT(RND*321)
PLOT LINES: x1,y1;x2,y2
NEXT n
END
50 linee 100 linee 200 linee
Pace e bene a tutti.
Gianfranco
Gianfranco
Re: Test del random
Non molto diverso dai risultati che si ottengono con le simulazioni in R che usa di default l'algoritmo Mersenne Twister: arguisco che lo stesso faccia Decimal Basic...
$n=50$
$n=100$
$n=200$
$n=50$
$n=100$
$n=200$
Codice: Seleziona tutto
nRip <- 200
x1 <- runif(nRip)
x2 <- runif(nRip)
y1 <- runif(nRip)
y2 <- runif(nRip)
plot((0:1),(0:1),type="n",axes=FALSE,xlab="",ylab="",asp=1)
box()
for (i in (1:nRip)) lines(c(x1[i],x2[i]),c(y1[i],y2[i]))
Ultima modifica di panurgo il lun mag 04, 2020 4:43 pm, modificato 1 volta in totale.
il panurgo
Principio di Relatività: $\mathbb{m} \not \to \mathbb{M} \, \Longleftrightarrow \, \mathbb{M} \not \to \mathbb{m}$
"Se la montagna non va a Maometto, Maometto NON va alla montagna"
Principio di Relatività: $\mathbb{m} \not \to \mathbb{M} \, \Longleftrightarrow \, \mathbb{M} \not \to \mathbb{m}$
"Se la montagna non va a Maometto, Maometto NON va alla montagna"
-
- Supervisore del sito
- Messaggi: 1723
- Iscritto il: ven mag 20, 2005 9:51 pm
- Località: Sestri Levante
- Contatta:
Re: Test del random
Bello R!
Il manuale originale del DECIMAL BASIC è scritto in giapponese tuttavia l'autore, Kazuo SHIRAISHI, ne ha reso disponibile una versione in inglese tradotta don Google translator.
A proposito del generatore di numeri casuali dice:
[Supplement]
The pseudorandom numbers generated by RND-functions are those generated by Mersenne Twister method.
They have precision of 52 bits on the binary or the complex mode, 50-bits on the decimal, 1000-digits decimal, or the RATIONAL operation mode.
The algorithm depends on mt19937ar.c by Matsumoto and Nishimura, 2002.
Il manuale originale del DECIMAL BASIC è scritto in giapponese tuttavia l'autore, Kazuo SHIRAISHI, ne ha reso disponibile una versione in inglese tradotta don Google translator.
A proposito del generatore di numeri casuali dice:
[Supplement]
The pseudorandom numbers generated by RND-functions are those generated by Mersenne Twister method.
They have precision of 52 bits on the binary or the complex mode, 50-bits on the decimal, 1000-digits decimal, or the RATIONAL operation mode.
The algorithm depends on mt19937ar.c by Matsumoto and Nishimura, 2002.
Pace e bene a tutti.
Gianfranco
Gianfranco
Re: Test del random
Bello, sì! Per esempio, se vuoi calcolare le intercette e le pendenze delle rette passanti per i segmenti basta fare
Codice: Seleziona tutto
nRip <- 20
x1 <- runif(nRip)
x2 <- runif(nRip)
y1 <- runif(nRip)
y2 <- runif(nRip)
b <- (y2 - y1)/(x2 - x1)
a <- y1 - b*x1
plot((0:1),(0:1),type="n",axes=FALSE,xlab="",ylab="",asp=1)
box()
for (i in (1:nRip)) {
points(x1[i], y1[i], col=i)
points(x2[i], y2[i], col=i)
abline(a[i], b[i], col=i)
}
il panurgo
Principio di Relatività: $\mathbb{m} \not \to \mathbb{M} \, \Longleftrightarrow \, \mathbb{M} \not \to \mathbb{m}$
"Se la montagna non va a Maometto, Maometto NON va alla montagna"
Principio di Relatività: $\mathbb{m} \not \to \mathbb{M} \, \Longleftrightarrow \, \mathbb{M} \not \to \mathbb{m}$
"Se la montagna non va a Maometto, Maometto NON va alla montagna"
-
- Supervisore del sito
- Messaggi: 1723
- Iscritto il: ven mag 20, 2005 9:51 pm
- Località: Sestri Levante
- Contatta:
Re: Test del random
NON per sfidare R ma per il gusto di provarci, ho riscritto il tuo programmino in DECIMAL BASIC.panurgo ha scritto: ↑lun mag 04, 2020 3:13 pmBello, sì! Per esempio, se vuoi calcolare le intercette e le pendenze delle rette passanti per i segmenti basta fareCodice: Seleziona tutto
nRip <- 20 x1 <- runif(nRip) x2 <- runif(nRip) y1 <- runif(nRip) y2 <- runif(nRip) b <- (y2 - y1)/(x2 - x1) a <- y1 - b*x1 plot((0:1),(0:1),type="n",axes=FALSE,xlab="",ylab="",asp=1) box() for (i in (1:nRip)) { points(x1[i], y1[i], col=i) points(x2[i], y2[i], col=i) abline(a[i], b[i], col=i) }
Codice: Seleziona tutto
DECLARE EXTERNAL SUB abline
LET lato=401
SET WINDOW 0,lato,0,lato
SET POINT STYLE 4
SET LINE STYLE 1
RANDOMIZE
LET nlinee=20
FOR n=1 TO nlinee
SET COLOR n
LET x1=INT(RND*lato)
LET y1=INT(RND*lato)
LET x2=INT(RND*lato)
LET y2=INT(RND*lato)
PLOT POINTS: x1,y1;x2,y2
CALL abline(x1,y1,x2,y2,lato)
NEXT n
END
EXTERNAL SUB abline(x1,y1,x2,y2,lato)
IF x2<>x1 THEN
LET b=(y2-y1)/(x2-x1)
LET a=y1-b*x1
LET a1=0
LET b1=b*a1+a
LET a2=lato
LET b2=b*a2+a
END IF
IF x2=x1 THEN
LET a1=x1
LET b1=0
LET a2=x2
LET b2=lato
END IF
PLOT LINES: a1,b1;a2,b2
Ecco il risultato. A questo proposito ho tre domande:
a) come si comporta il tuo programma nel malaugurato caso x1=x2?
b) la procedura (o funzione) "abline" fa parte del linguaggio R?
c) come si usa in questo stesso caso la procedura (o funzione) abline?
Spero di essermi espresso correttamente.
Grazie.
Pace e bene a tutti.
Gianfranco
Gianfranco
Re: Test del random
a) crash! La divisione per 0 non è un problema: 1/0 -> Inf e -1/0 -> -Inf; è la funzione abline del package graphics che non è molto furba: vuole che 'a' e 'b' siano finiti (la probabilità di una simile evenienza mi pare tuttavia trascurabile)
b) funzione abline, package graphics
c) abline(a='q', b='m') traccia la retta y = m x + q, abline(h='y') traccia una retta orizzontale, abline(v='x') traccia una retta verticale.
b) funzione abline, package graphics
c) abline(a='q', b='m') traccia la retta y = m x + q, abline(h='y') traccia una retta orizzontale, abline(v='x') traccia una retta verticale.
il panurgo
Principio di Relatività: $\mathbb{m} \not \to \mathbb{M} \, \Longleftrightarrow \, \mathbb{M} \not \to \mathbb{m}$
"Se la montagna non va a Maometto, Maometto NON va alla montagna"
Principio di Relatività: $\mathbb{m} \not \to \mathbb{M} \, \Longleftrightarrow \, \mathbb{M} \not \to \mathbb{m}$
"Se la montagna non va a Maometto, Maometto NON va alla montagna"
-
- Supervisore del sito
- Messaggi: 1723
- Iscritto il: ven mag 20, 2005 9:51 pm
- Località: Sestri Levante
- Contatta: