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 ne restituiscono un razionale approssimativo π. Innanzitutto generano tutti npunti 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
Countcon la condizione che Norm[p] < 1.
- Il secondo sottrae la norma di ciascun punto da
1e quindi arrotonda per eccesso. Questo trasforma i numeri all'interno del cerchio unitario in 1e 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 Roundinvece di Ceiling.
Aaaaa e mentre scrivevo questo, mi è venuto in mente che esiste davvero una soluzione più breve, se solo sottraggo 2e 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 Meaninvece Tre 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)]&