Test del random

Il forum di Base5, dove è possibile postare problemi, quiz, indovinelli, rompicapo, enigmi e quant'altro riguardi la matematica ricreativa e oltre.

Moderatori: Gianfranco, Bruno

Rispondi
Pasquale
Livello 11
Livello 11
Messaggi: 2563
Iscritto il: mer mag 25, 2005 2:14 am

Test del random

Messaggio da Pasquale »

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? :?
_________________

\text {     }ciao Immagine ciao
E' la somma che fa il totale (Totò)

Gianfranco
Supervisore del sito
Supervisore del sito
Messaggi: 1176
Iscritto il: ven mag 20, 2005 9:51 pm
Località: Sestri Levante
Contatta:

Re: Test del random

Messaggio da Gianfranco »

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ì:

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
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

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
puntirandom.PNG
puntirandom.PNG (57.55 KiB) Visto 1065 volte
Pace e bene a tutti.
Gianfranco

panurgo
Livello 9
Livello 9
Messaggi: 1325
Iscritto il: sab nov 19, 2005 3:45 pm
Località: Padova

Re: Test del random

Messaggio da panurgo »

Ehi, Gianfranco: potresti simulare $x_1$, $x_2$, $y_1$, $y_2$ e fare il grafico dei segmenti?
il panurgo

Principio di Relatività: {\bb m} \not \right {\bb M} \ \Longleftrightarrow \ {\bb M} \not \right {\bb m}
"Se la montagna non va a Maometto, Maometto NON va alla montagna"

Gianfranco
Supervisore del sito
Supervisore del sito
Messaggi: 1176
Iscritto il: ven mag 20, 2005 9:51 pm
Località: Sestri Levante
Contatta:

Re: Test del random

Messaggio da Gianfranco »

panurgo ha scritto:
lun mag 04, 2020 12:15 pm
Ehi, Gianfranco: potresti simulare $x_1$, $x_2$, $y_1$, $y_2$ e fare il grafico dei segmenti?
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
Esempi di risultato.
50 linee
50linee.PNG
50linee.PNG (10.68 KiB) Visto 1059 volte
100 linee
100linee.PNG
100linee.PNG (19.44 KiB) Visto 1059 volte
200 linee
200linee.PNG
200linee.PNG (26.21 KiB) Visto 1059 volte
Pace e bene a tutti.
Gianfranco

panurgo
Livello 9
Livello 9
Messaggi: 1325
Iscritto il: sab nov 19, 2005 3:45 pm
Località: Padova

Re: Test del random

Messaggio da panurgo »

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$
TestDelRandom.050.png
TestDelRandom.050.png (15.12 KiB) Visto 1057 volte
$n=100$
TestDelRandom.100.png
TestDelRandom.100.png (25.92 KiB) Visto 1057 volte
$n=200$
TestDelRandom.200.png
TestDelRandom.200.png (36.05 KiB) Visto 1057 volte

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à: {\bb m} \not \right {\bb M} \ \Longleftrightarrow \ {\bb M} \not \right {\bb m}
"Se la montagna non va a Maometto, Maometto NON va alla montagna"

Gianfranco
Supervisore del sito
Supervisore del sito
Messaggi: 1176
Iscritto il: ven mag 20, 2005 9:51 pm
Località: Sestri Levante
Contatta:

Re: Test del random

Messaggio da Gianfranco »

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.
Pace e bene a tutti.
Gianfranco

panurgo
Livello 9
Livello 9
Messaggi: 1325
Iscritto il: sab nov 19, 2005 3:45 pm
Località: Padova

Re: Test del random

Messaggio da panurgo »

Gianfranco ha scritto:
lun mag 04, 2020 1:34 pm
Bello R!
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)
}
TestDelRandom.020.png
TestDelRandom.020.png (19.47 KiB) Visto 1044 volte
il panurgo

Principio di Relatività: {\bb m} \not \right {\bb M} \ \Longleftrightarrow \ {\bb M} \not \right {\bb m}
"Se la montagna non va a Maometto, Maometto NON va alla montagna"

Gianfranco
Supervisore del sito
Supervisore del sito
Messaggi: 1176
Iscritto il: ven mag 20, 2005 9:51 pm
Località: Sestri Levante
Contatta:

Re: Test del random

Messaggio da Gianfranco »

panurgo ha scritto:
lun mag 04, 2020 3:13 pm
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)
}
NON per sfidare R ma per il gusto di provarci, ho riscritto il tuo programmino in DECIMAL BASIC.

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
Anche in DECBASIC il programmino è abbastanza compatto, se escludiamo il fatto che ho dovuto creare la procedura "abline" che non è nativa in DECBASIC.

Ecco il risultato.
retteacaso.PNG
retteacaso.PNG (13.83 KiB) Visto 1033 volte
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

panurgo
Livello 9
Livello 9
Messaggi: 1325
Iscritto il: sab nov 19, 2005 3:45 pm
Località: Padova

Re: Test del random

Messaggio da panurgo »

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.
il panurgo

Principio di Relatività: {\bb m} \not \right {\bb M} \ \Longleftrightarrow \ {\bb M} \not \right {\bb m}
"Se la montagna non va a Maometto, Maometto NON va alla montagna"

Gianfranco
Supervisore del sito
Supervisore del sito
Messaggi: 1176
Iscritto il: ven mag 20, 2005 9:51 pm
Località: Sestri Levante
Contatta:

Re: Test del random

Messaggio da Gianfranco »

Grazie Panurgo, chiaro ed esauriente!
Pace e bene a tutti.
Gianfranco

Rispondi