PL/SQL Example Roulette

set serveroutput on

DECLARE
   
   i		NUMBER := 0;
   x		BINARY_INTEGER;
   y		VARCHAR2(2);
   flag		VARCHAR2(5);
   sign		NUMBER := 1;
   bet		NUMBER := 1;
   next_bet	NUMBER := 1;
   total	NUMBER := 0;

   count_1	NUMBER := 0;
   count_2	NUMBER := 0;
   count_4	NUMBER := 0;
   count_8      NUMBER := 0;
   count_16	NUMBER := 0;
   count_32	NUMBER := 0;
   count_64	NUMBER := 0;
   count_128    NUMBER := 0;
   count_256    NUMBER := 0;
   count_512    NUMBER := 0;
   count_1024   NUMBER := 0;
   count_2048   NUMBER := 0;

PROCEDURE count_bet is
BEGIN
   IF bet = 1 THEN
      count_1 := count_1 + 1;
   ELSIF bet = 2 THEN
      count_2 := count_2 + 1;
   ELSIF bet = 4 THEN
      count_4 := count_4 + 1;
   ELSIF bet = 8 THEN
      count_8 := count_8 + 1;
   ELSIF bet = 16 THEN
      count_16 := count_16 + 1;
   ELSIF bet = 32 THEN
      count_32 := count_32 + 1;
   ELSIF bet = 64 THEN
      count_64 := count_64 + 1;
   ELSIF bet = 128 THEN
      count_128 := count_128 + 1;
   ELSIF bet = 256 THEN
      count_256 := count_256 + 1;
   ELSIF bet = 512 THEN
      count_512 := count_512 + 1;
   ELSIF bet = 1024 THEN
      count_1024 := count_1024 + 1;
   ELSE
      count_2048 := count_2048 + 1;
   END IF;
END;

PROCEDURE proc_loop is
BEGIN
   x := ABS(MOD(DBMS_RANDOM.RANDOM,100)) + 1;
   bet := next_bet;

   IF x < 48 THEN
      flag := 'WIN  ';
      next_bet := 1;
      sign := 1;
   ELSE
      flag := 'LOOSE';
      next_bet := bet * 2;
      sign := -1;
   END IF;

   i := i + 1;
   total := total + (bet*sign);
   DBMS_OUTPUT.PUT_LINE('i: '||lpad(i,6)||' x: '||lpad(x,2)||' '||flag||' Bet: $'||lpad(bet,3)||' Total: $'||total);
   count_bet();
END;

PROCEDURE proc1 is
BEGIN
   DBMS_OUTPUT.PUT_LINE('Proc1');
   DBMS_RANDOM.INITIALIZE(123456789);

   FOR i IN 1..10000 LOOP

      proc_loop();

   END LOOP;

   DBMS_RANDOM.TERMINATE;

   DBMS_OUTPUT.PUT_LINE('Results:');
   DBMS_OUTPUT.PUT_LINE('$   1.00 Bets: '||count_1);
   DBMS_OUTPUT.PUT_LINE('$   2.00 Bets: '||count_2);
   DBMS_OUTPUT.PUT_LINE('$   4.00 Bets: '||count_4);
   DBMS_OUTPUT.PUT_LINE('$   8.00 Bets: '||count_8);
   DBMS_OUTPUT.PUT_LINE('$  16.00 Bets: '||count_16);
   DBMS_OUTPUT.PUT_LINE('$  32.00 Bets: '||count_32);
   DBMS_OUTPUT.PUT_LINE('$  64.00 Bets: '||count_64);
   DBMS_OUTPUT.PUT_LINE('$ 128.00 Bets: '||count_128);
   DBMS_OUTPUT.PUT_LINE('$ 256.00 Bets: '||count_256);
   DBMS_OUTPUT.PUT_LINE('$ 512.00 Bets: '||count_512);
   DBMS_OUTPUT.PUT_LINE('$1024.00 Bets: '||count_1024);
   DBMS_OUTPUT.PUT_LINE('$2048.00 Bets: '||count_2048);
   DBMS_OUTPUT.PUT_LINE('Total:'||(count_1+count_2+count_4+count_8+count_16+count_32+count_64+count_128+count_256+count_512+count_1024+count_2048));

END proc1;

BEGIN
   DBMS_OUTPUT.PUT_LINE('MAIN');
   dbms_output.enable(1000000);
   proc1();
END;
/

Output:


SQL> /
MAIN                                                                                                
Proc1                                                                                               
i:      1 x: 38 WIN   Bet: $  1 Total: $1                                                           
i:      2 x: 81 LOOSE Bet: $  1 Total: $0                                                           
i:      3 x: 69 LOOSE Bet: $  2 Total: $-2                                                          
i:      4 x: 48 LOOSE Bet: $  4 Total: $-6                                                          
i:      5 x: 20 WIN   Bet: $  8 Total: $2                                                           
i:      6 x: 93 LOOSE Bet: $  1 Total: $1                                                           
i:      7 x: 32 WIN   Bet: $  2 Total: $3                                                           
i:      8 x: 46 WIN   Bet: $  1 Total: $4                                                           
i:      9 x: 40 WIN   Bet: $  1 Total: $5                                                           
i:     10 x: 65 LOOSE Bet: $  1 Total: $4 

...

i:    264 x: 92 LOOSE Bet: $ 32 Total: $56                                                          
i:    265 x: 49 LOOSE Bet: $ 64 Total: $-8                                                          
i:    266 x: 60 LOOSE Bet: $128 Total: $-136                                                        
i:    267 x: 59 LOOSE Bet: $256 Total: $-392   
...

i:   1918 x: 18 WIN   Bet: $  1 Total: $911                                                         
i:   1919 x: 81 LOOSE Bet: $  1 Total: $910                                                         
i:   1920 x: 95 LOOSE Bet: $  2 Total: $908                                                         
i:   1921 x: 54 LOOSE Bet: $  4 Total: $904                                                         
i:   1922 x: 94 LOOSE Bet: $  8 Total: $896                                                         
i:   1923 x: 52 LOOSE Bet: $ 16 Total: $880                                                         
i:   1924 x: 49 LOOSE Bet: $ 32 Total: $848                                                         
i:   1925 x: 65 LOOSE Bet: $ 64 Total: $784                                                         
i:   1926 x: 75 LOOSE Bet: $128 Total: $656                                                         
i:   1927 x: 88 LOOSE Bet: $256 Total: $400                                                         
i:   1928 x: 76 LOOSE Bet: $512 Total: $-112                                                        
i:   1929 x: 20 WIN   Bet: $102 Total: $912                                                         
i:   1930 x:  7 WIN   Bet: $  1 Total: $913                                                         
i:   1931 x: 85 LOOSE Bet: $  1 Total: $912  
...

i:   9990 x: 49 LOOSE Bet: $  2 Total: $4733
i:   9991 x: 16 WIN   Bet: $  4 Total: $4737
i:   9992 x: 73 LOOSE Bet: $  1 Total: $4736
i:   9993 x: 75 LOOSE Bet: $  2 Total: $4734
i:   9994 x: 82 LOOSE Bet: $  4 Total: $4730
i:   9995 x: 80 LOOSE Bet: $  8 Total: $4722
i:   9996 x: 95 LOOSE Bet: $ 16 Total: $4706
i:   9997 x: 44 WIN   Bet: $ 32 Total: $4738
i:   9998 x: 86 LOOSE Bet: $  1 Total: $4737
i:   9999 x: 87 LOOSE Bet: $  2 Total: $4735
i:  10000 x: 83 LOOSE Bet: $  4 Total: $4731

Results:

$   1.00 Bets: 4739
$   2.00 Bets: 2481
$   4.00 Bets: 1321
$   8.00 Bets: 706
$  16.00 Bets: 360
$  32.00 Bets: 199
$  64.00 Bets: 99
$ 128.00 Bets: 51
$ 256.00 Bets: 27
$ 512.00 Bets: 12
$1024.00 Bets: 4
$2048.00 Bets: 1

Total:10000

PL/SQL procedure successfully completed.