Mathematica, 42 40 39 byte (o 31/29?)
Ho tre soluzioni tutte a 42 byte:
4Count[1~RandomReal~{#,2},p_/;Norm@p<1]/#&
4Tr@Ceiling[1-Norm/@1~RandomReal~{#,2}]/#&
4Tr@Round[1.5-Norm/@1~RandomReal~{#,2}]/#&
Sono tutte funzioni senza nome che prendono il numero di campioni n
e restituiscono un razionale approssimativo π. Innanzitutto generano tutti n
punti nel quadrato dell'unità nel quadrante positivo. Quindi determinano il numero di quei campioni che si trovano all'interno del cerchio unitario, quindi si dividono per il numero di campioni e si moltiplicano per 4
. L'unica differenza è nel modo in cui determinano il numero di sampple all'interno del cerchio unitario:
- Il primo usa
Count
con la condizione che Norm[p] < 1
.
- Il secondo sottrae la norma di ciascun punto da
1
e quindi arrotonda per eccesso. Questo trasforma i numeri all'interno del cerchio unitario in 1
e quelli esterni a 0
. In seguito li riassumo con Tr
.
- Il terzo fa essenzialmente lo stesso, ma sottrae il da
1.5
, quindi posso usare Round
invece di Ceiling
.
Aaaaa e mentre scrivevo questo, mi è venuto in mente che esiste davvero una soluzione più breve, se solo sottraggo 2
e quindi uso Floor
:
4Tr@Floor[2-Norm/@1~RandomReal~{#,2}]/#&
o salvando un altro byte utilizzando gli operatori di pavimentazione o soffitto Unicode:
4Tr@⌊2-Norm/@1~RandomReal~{#,2}⌋/#&
4Tr@⌈1-Norm/@1~RandomReal~{#,2}⌉/#&
Si noti che le tre soluzioni basate sull'arrotondamento possono anche essere scritte con Mean
invece Tr
e senza il /#
, sempre per gli stessi byte.
Se altri approcci basati su Monte Carlo vanno bene (in particolare, quello scelto da Peter), posso fare 31 byte stimando l'integrale di o 29 usando l'integrale di , questa volta dato come un numero in virgola mobile:√(1-x2)
1/(1+x2)
4Mean@Sqrt[1-1~RandomReal~#^2]&
Mean[4/(1+1~RandomReal~#^2)]&