Track
/
Julia
Julia
/
Esercizi
/
Probabilità problematiche
Probabilità problematiche

Probabilità problematiche

Esercizio di apprendimento

Introduzione

Rational numbers sono frazioni con un numeratore intero diviso per un denominatore intero.

Ad esempio, possiamo memorizzare 2//3 come frazione esatta invece del valore approssimato Float64 0.6666...

Il vantaggio è che (tranne nel caso estremo di overflow di interi) un numero razionale rimane esatto, evitando gli errori di arrotondamento spesso inevitabili con i numeri in virgola mobile.

I numeri razionali sono un tipo numerico piuttosto semplice e sono pensati per funzionare proprio come ti aspetteresti. Poiché sono un tipo standard in Julia fin dalle prime versioni, la maggior parte delle funzioni li accetta come input allo stesso modo degli interi e dei numeri in virgola mobile.

Creazione di numeri razionali

La creazione è semplice come usare // tra due interi.

julia> 3//4
3//4

julia> a = 3; b = 4;

julia> a//b
3//4

I fattori comuni vengono rimossi automaticamente, convertendo la frazione ai suoi «minimi termini»: i più piccoli interi che rappresentano accuratamente la frazione, con denominatore non negativo.

julia> 5//15
1//3

julia> 5//-15
-1//3

Aritmetica con i numeri razionali

I soliti arithmetic operators + - * / ^ % funzionano con i razionali, essenzialmente come con gli altri tipi numerici.

Gli interi e altri Rational possono essere inclusi e danno come risultato un Rational. Includere un float nell'espressione produce un output float, con una conseguente (possibile) perdita di precisione.

Se desideri un float, usa semplicemente la funzione float() per convertire un razionale. È del tutto normale usare numeri razionali per preservare la precisione durante un calcolo lungo, per poi convertire in un numero in virgola mobile alla fine.

julia> 3//4 + 1//3  # addition
13//12

julia> 3//4 * 1//3  # multiplication
1//4

julia> 3//4 / 1//3  # division
9//4

julia> 3//4 ^ 2  # exponentiation
3//16

julia> 3//4 + 5  # rational and int => rational
23//4

julia> 3//4 + 5.3  # rational and float => float
6.05

julia> float(3//4)  # casting
0.75

Altre operazioni

In Julia, i numeri razionali sono semplicemente numeri. Di solito il compilatore converte i tipi secondo necessità.

Tuttavia, fai attenzione: i confronti funzionano per frazioni con una rappresentazione decimale finita:

julia> 3//4 == 0.75
true

julia> 3//4 < 0.74
false

Negli altri casi, però, un Rational va convertito in un Float per i confronti:

julia> 1//3 == 1/3
false

julia> float(1//3) == 1/3
true

Le funzioni matematiche accettano numeri razionali come input, ma possono restituire un risultato in virgola mobile:

julia> sqrt(9//16)
0.75

Istruzioni

Un'organizzazione di ricerca ha notato che alcuni dei suoi ricercatori junior hanno usato metodi poco ottimali nelle loro analisi. Uno di questi metodi consiste nel convertire immediatamente le probabilità discrete in numeri in virgola mobile (cioè numeri reali) prima di eseguire ulteriori calcoli.

I ricercatori senior preferiscono usare numeri razionali nei calcoli, che possono garantire una precisione maggiore, e vorrebbero sapere se le pratiche scadenti dei ricercatori junior hanno influenzato gli esiti degli studi.

Sono stati condotti due tipi di studi:

  • Sono stati eseguiti molti test, ciascuno restituiva una probabilità discreta di successo, poi è stata calcolata la media di queste probabilità.
  • Sono stati testati molti eventi indipendenti, e la probabilità totale che tutti gli eventi si verificassero è stata calcolata moltiplicando tra loro le rispettive probabilità.

I ricercatori senior ti chiedono di scrivere funzioni che li aiutino a determinare se ci sono errori di arrotondamento nelle analisi dovuti all'uso dei numeri in virgola mobile, e di fornire un numero razionale preciso per il risultato qualora ci siano errori.

1. Fornisci il rapporto tra successi e prove

La funzione rationalize(successes, trials) prende due array, successes e trials. Per un indice i, successes[i] corrisponde al numero di successi che si sono verificati in trials[i] prove. La funzione restituisce un array di numeri razionali dei successi sul numero di prove, nello stesso ordine degli array di input.

julia> rationalize([1, 2, 3], [4, 5, 6])
3-element Vector{Rational{Int64}}:
 1//4
 2//5
 1//2

2. Trova le probabilità reali associate al rapporto tra successi e prove

Allo stesso modo, la funzione probabilities(successes, trials) prende due array, successes e trials. Restituisce un array di numeri in virgola mobile dei successi sul numero di prove, nello stesso ordine degli array di input.

julia> probabilities([1, 2, 3], [4, 5, 6])
3-element Vector{Float64}:
 0.25
 0.4
 0.5

3. Controlla la media delle probabilità

La funzione checkmean(successes, trials) prende i due array, successes e trials. Confronta la media delle probabilità reali con la media delle probabilità razionali.

  • Se le due probabilità sono uguali, checkmean restituisce true
  • Se le due probabilità sono diverse, checkmean restituisce la probabilità razionale.
julia> successes, trials = [9, 4, 7, 8, 6], [22, 22, 11, 17, 12];
julia> checkmean(successes, trials)
true

julia> successes, trials = [6, 5, 9, 8, 9], [21, 19, 13, 25, 22];
julia> checkmean(successes, trials)
1873629//4754750

4. Controlla la probabilità di eventi indipendenti

La funzione checkprob(successes, trials) prende i due array, successes e trials. Confronta la probabilità totale calcolata con i numeri in virgola mobile con quella calcolata con i numeri razionali.

  • Se le due probabilità sono uguali, checkprob restituisce true
  • Se le due probabilità sono diverse, checkprob restituisce la probabilità razionale.
julia> successes, trials = [2, 9, 4, 4, 5], [15, 11, 17, 19, 15];
julia> checkprob(successes, trials)
true

julia> successes, trials = [9, 8, 5, 4, 3], [22, 14, 19, 25, 18];
julia> checkprob(sucesses, trials)
12//7315
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Julia Exercism

Vuoi iniziare Probabilità problematiche?

Iscriviti a Exercism per imparare e padroneggiare Julia con 35 concetti128 esercizi e il mentoring di persone reali, tutto gratis.