20 lines
562 B
Text
20 lines
562 B
Text
create or replace function mcPi(n) as (
|
|
with recursive cte as (
|
|
select -1 as i, 0 as count, NULL::DOUBLE as x, NULL::DOUBLE as y
|
|
union all
|
|
select i+1 as i,
|
|
count + if( x*x + y*y <= 1, 1, 0) as count,
|
|
random() as x,
|
|
random() as y
|
|
from cte
|
|
where i < n
|
|
)
|
|
select last( 4 * count / n order by i)
|
|
from cte
|
|
);
|
|
|
|
# Examples:
|
|
|
|
select n, mcPi, format('{:.5f}', (mcPi - pi()) / pi()) as "relative error"
|
|
from (select n, mcPi(n) as mcPi
|
|
from (select unnest([100, 1000, 10000, 100000, 200000]) as n));
|