Pagina 1 di 1
La funzione rnd()
Inviato: gio lug 04, 2019 4:41 pm
da franco
Prisca vuole testare sul suo PC la funzione $rdn()$ che le permette di generare dei numeri casuali in un intervallo dato,
Ha scelto due numeri interi $a$ e $b$ con $a$ multiplo di $b$ $(a = kb, k > 1)$ e vuole stimare $Pr(XY ≤ b^2)$, ossia la probabilità che il prodotto di due numeri casuali indipendenti $X$ e $Y$ scelti nell'intervallo $[0,a]$, sia inferiore o uguale a $b^2$.
Per far ciò ha scritto un programmino in basic usando la funzione $rnd()$, un ciclo $« for...next »$ con un milione di iterazioni e un contatore che si incrementa di un'unità ogni volta che la condizione di cui sopra è rispettata.
Al termine dell'esecuzione della routine il contatore segna $N = 596489$.
Determinare il valore dell'intero $k$
G184 www.diophante.fr
Re: La funzione rnd()
Inviato: gio lug 04, 2019 6:20 pm
da panurgo
Lo spazio campionario della coppia di numeri casuali è il quadrato $a\times a$; in questo spazio il luogo geometrico delle coppie $\left\{x,y\right\}$ per le quali il prodotto è uguale a $b^2$ è l’iperbole $y= b^2/x$
- lafunzrnd_480x480.png (9.6 KiB) Visto 4371 volte
e la frequenza relativa dei casi favorevoli è il rapporto tra l’area a sinistra e sotto l’iperbole e l’area del del quadrato.
Dato che entrambe sono proporzionali a $b^2$ possiamo porre con tranquillità $b=1$ e, quindi, $a=k$.
La retta tratteggiata è $x = 1/k$ e la frequenza relativa è
$\displaystyle f\left(k\right)=\frac{\displaystyle \frac1k\cdot k + \int_{\frac1k}^k{\frac{dx}{x}}}{k^2} = \frac{1 + 2\ln{k}}{k^2}$
Con le frequenze osservate, $k=2$.
P.S.: mi preme consigliare caldamente l'uso di
R; ecco il codice che simula questo processo
Codice: Seleziona tutto
x <- runif(1e6)
y <- runif(1e6)
for (k in (1:10)) print(length(which((k*x)*(k*y) <= 1)))
Re: La funzione rnd()
Inviato: ven lug 05, 2019 5:48 pm
da franco
Impeccabile!
Non resta che tradurlo in Francese e spedire la soluzione agli amici transalpini.
...
anzi no!
Nel problema originale c'erano altre due domande che non ho riportato qui sul forum.
Durante il weekend cerco di capirle un po' meglio (il mio francese è a dir poco approssimativo) e poi ci risentiamo ...
Re: La funzione rnd()
Inviato: ven lug 05, 2019 7:28 pm
da franco
Prisca sceglie le due variabili indipendenti $X$ e $Y$ sull'intervallo $[0,2a]$ e conta con la sua routine $N=Pr( X*Y ≤ b^2)$.
Sempre con un milione di iterazioni, determinare un intervallo di confidenza (con una soglia del 95%)
(*) all'interno del quale ci si aspetta che si attesti il valore di $N$ che apparirà sullo schermo del PC.
Prisca introduce una nuova variabile $Z$ ($X$, $Y$ e $Z$ indipendenti fra loro e definite nell'intervallo $[0,a]$).
Calcolare $Pr( X*Y*Z ≤ b^3)$ e verificare che il vostro PC confermi il risultato.
(*) non sono sicuro che la terminologia sia corretta ma spero si capisca
Re: La funzione rnd()
Inviato: ven lug 05, 2019 7:32 pm
da franco
Giusto per la cronaca, tornando al primo quesito, questa è la routine in VBA per excel che ho usato per fare il test sulla funzione $rnd()$
Codice: Seleziona tutto
Sub TestRND()
Randomize
Imax = Cells(1, 2)
k = Cells(2, 2)
N = 0
For I = 1 To Imax
X = k * Rnd()
Y = k * Rnd()
If X * Y <= 1 Then
N = N + 1
End If
Next
Cells(3, 2) = N
End Sub
Mi ha dato, come primo risultato, $N=596434$.
La routine scritta in R sembra più sintetica ma per me è un po' criptica
Re: La funzione rnd()
Inviato: ven lug 05, 2019 11:12 pm
da panurgo
genera il vettore x che contiene un milione di numeri casuali tra 0 e 1
genera il vettore y che contiene un altro milione di numeri casuali tra 0 e 1
esegue un ciclo nel quale k assume tutti i valori tra 1 e 10
...
numero di elementi in un vettore
genera un vettore che contiene gli indirizzi degli elementi di un altro vettore che soddisfano una condizione
genera un vettore di un milione di elementi tra 0 e k
genera un vettore di un milione di altri elementi tra 0 e k
è il vettore che contiene il milione di prodotti x y
Codice: Seleziona tutto
for (k in (1:10)) print(length(which((k*x)*(k*y) <= 1)))
per tutti i valori di k tra 1 e 10 stampa il numero di elementi xy che sono minori o uguali a 1