Для наших опытов создадим очень простую функцию, которая случайным образом будет возвращать целые числа в интервале, заданном входным параметром:
drop function RandInt; CREATE FUNCTION RandInt (X integer) RETURNS integer LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION not DETERMINISTIC RETURN int(X * Rand() + .5);В принципе её можно не создавать, но она сильно упрощает задачу и делает решение красивее и доступней для понимания.
Так RandInt(1) иммитирует бросание монеты: 0 - решка, 1 - орёл.
Подбросим монетку:
select case when randint(test) = 0 then 'Tail' else 'Head' end "Game With Dime" from (select 1 test from sysibm.sysdummy1) tst;
Где Tail - Решка, а Head соответсвенно - Орёл
Будем подбрасывать её много раз (например 10000 раз), чтобы найти Математическое Ожидание.
Наверное устанем, если не используем возможности
with prob (k, maxK, total) as (select 0, 10000, 0 from sysibm.sysdummy1 union all select k + 1, maxK, total + randint(1) from prob where k + 1 <= maxK ) select maxK, total from prob where k = maxK;Испытайте сами на своём компьютере и убедитесь как близко математическое ожидание к середине
10000 / 2 = 5000
Lenny