Pagina 1 di 1

La funzione rnd()

Inviato: gio lug 04, 2019 3: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 5: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
lafunzrnd_480x480.png (9.6 KiB) Visto 116 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 4:48 pm
da franco
Impeccabile!

Non resta che tradurlo in Francese e spedire la soluzione agli amici transalpini.

...

anzi no! :twisted:
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 6: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 6: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 :D :D

Re: La funzione rnd()

Inviato: ven lug 05, 2019 10:12 pm
da panurgo

Codice: Seleziona tutto

x <- runif(1e6)
genera il vettore x che contiene un milione di numeri casuali tra 0 e 1

Codice: Seleziona tutto

y <- runif(1e6)
genera il vettore y che contiene un altro milione di numeri casuali tra 0 e 1

Codice: Seleziona tutto

for (k in (1:10))
esegue un ciclo nel quale k assume tutti i valori tra 1 e 10

Codice: Seleziona tutto

print( )
...

Codice: Seleziona tutto

length( )
numero di elementi in un vettore

Codice: Seleziona tutto

which( )
genera un vettore che contiene gli indirizzi degli elementi di un altro vettore che soddisfano una condizione

Codice: Seleziona tutto

k*x
genera un vettore di un milione di elementi tra 0 e k

Codice: Seleziona tutto

k*y
genera un vettore di un milione di altri elementi tra 0 e k

Codice: Seleziona tutto

(k*x)*(k*y)
è 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