La funzione rnd()

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
franco
Livello 8
Livello 8
Messaggi: 965
Iscritto il: mar dic 12, 2006 12:57 pm
Località: Bèrghem (Sardegna)

La funzione rnd()

Messaggio da franco » gio lug 04, 2019 3:41 pm

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
Franco

ENGINEER
noun. (en-juh-neer)
someone who does precision guesswork based on unreliable data provided by those of questionable knowledge.
See also wizard, magician

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

Re: La funzione rnd()

Messaggio da panurgo » gio lug 04, 2019 5:20 pm

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 119 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)))
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"

franco
Livello 8
Livello 8
Messaggi: 965
Iscritto il: mar dic 12, 2006 12:57 pm
Località: Bèrghem (Sardegna)

Re: La funzione rnd()

Messaggio da franco » ven lug 05, 2019 4:48 pm

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

ENGINEER
noun. (en-juh-neer)
someone who does precision guesswork based on unreliable data provided by those of questionable knowledge.
See also wizard, magician

franco
Livello 8
Livello 8
Messaggi: 965
Iscritto il: mar dic 12, 2006 12:57 pm
Località: Bèrghem (Sardegna)

Re: La funzione rnd()

Messaggio da franco » ven lug 05, 2019 6:28 pm

:?:
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 :)
Franco

ENGINEER
noun. (en-juh-neer)
someone who does precision guesswork based on unreliable data provided by those of questionable knowledge.
See also wizard, magician

franco
Livello 8
Livello 8
Messaggi: 965
Iscritto il: mar dic 12, 2006 12:57 pm
Località: Bèrghem (Sardegna)

Re: La funzione rnd()

Messaggio da franco » ven lug 05, 2019 6:32 pm

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
Franco

ENGINEER
noun. (en-juh-neer)
someone who does precision guesswork based on unreliable data provided by those of questionable knowledge.
See also wizard, magician

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

Re: La funzione rnd()

Messaggio da panurgo » ven lug 05, 2019 10:12 pm

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

Rispondi