|
SQL> set serveroutput on;
SQL>
SQL>
SQL> declare
2 l_v int :=0;
3 l_res number :=0;
4 begin
5
6 delete from res;
7
8 for i in 1..10000 loop
9 with t as (select level n from dual connect by level <= 12),
10 r as (select n,
11 decode(n - 1, 0, 12, n - 1) left_n,
12 case
13 when n + 1 > 12 then
14 mod(n + 1, 12)
15 else
16 n + 1
17 end right_n
18 from t ),
19 s(lvl,list_n,curr_n) as (select 1,cast(1 as varchar2(4000)),1 from dual
20 union all
21 select lvl + 1,
22 s.list_n ||','||case when a.x =1 then r.left_n else r.right_n end,
23 case when a.x =1 then r.left_n else r.right_n end
24 from s,r,(select ceil(dbms_random.value(0,2)) x from dual) a
25 where (
26 instr(s.list_n,',2')=0
27 or instr(s.list_n,3)=0
28 or instr(s.list_n,4)=0
29 or instr(s.list_n,5)=0
30 or instr(s.list_n,6)=0
31 or instr(s.list_n,7)=0
32 or instr(s.list_n,8)=0
33 or instr(s.list_n,9)=0
34 or instr(s.list_n,10)=0
35 or instr(s.list_n,11)=0
36 or instr(s.list_n,12)=0
37 )
38 and s.curr_n = r.n
39 )
40 select substr(list_n,instr(list_n,',',-1)+1) end_n
41 into l_v
42 from s
43 where lvl = (select max(lvl) from s);
44
45 insert into res values(i,l_v);
46
47 end loop;
48 commit;
49
50 select sum(case when v=6 then 1 end)/count(*) into l_res from RES;
51
52 dbms_output.put_line( 'result = '||l_res );
53 end;
54 /
result = .0945
PL/SQL procedure successfully completed
SQL> /
result = .0946
PL/SQL procedure successfully completed
SQL> /
result = .0878
PL/SQL procedure successfully completed
SQL> /
result = .0901
PL/SQL procedure successfully completed
SQL> /
result = .0935
PL/SQL procedure successfully completed |
|