Перейти к содержимому

Фотография

Опыты по Теории Вероятностей


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 13

#1 LKhiger

LKhiger

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Леонид Хигер
  • Город:NY

Отправлено 11 октября 2010 - 01:55

Опыты по Теории Вероятностей

Для наших опытов создадим очень простую функцию, которая случайным образом будет возвращать целые числа в интервале, заданном входным параметром:

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
  • 0

#2 LKhiger

LKhiger

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Леонид Хигер
  • Город:NY

Отправлено 11 октября 2010 - 13:44

Моделирование броска кости.

Как известно, может выпасть от 1 до 6:

select case when dice = 1 then 'One'
when dice = 2 then 'Two'
when dice = 3 then 'Three'
when dice = 4 then 'Four'
when dice = 5 then 'Five'
else 'Six'
end "Game With Dice" 
from
(select randint(5) + 1 dice from sysibm.sysdummy1) dce;

  • 0

#3 LKhiger

LKhiger

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Леонид Хигер
  • Город:NY

Отправлено 11 октября 2010 - 16:27

Моделирование броска кости.

Можно сделать красивее:


select gm.dice
from
(select randint(5) + 1 rdc from sysibm.sysdummy1) dce
join table
(
select case when rdc = 1 then '    '
                 when rdc = 2 then  ' * '
                 when rdc = 3 then  '*  '
                 when rdc = 4 then  '* *'
                 when rdc = 5 then  '* *'
                 when rdc = 6 then  '** '
       end dice
from sysibm.sysdummy1

union all

select case when rdc = 1 then  ' * '
                 when rdc = 2 then  '    '
                 when rdc = 3 then  ' * '
                 when rdc = 4 then  '    '
                 when rdc = 5 then  ' * '
                 when rdc = 6 then  '** '
       end dice
from sysibm.sysdummy1

union all

select case when rdc = 1 then  '   '
                 when rdc = 2 then  ' * '
                 when rdc = 3 then  '  *'
                 when rdc = 4 then  '* *'
                 when rdc = 5 then  '* *'
                 when rdc = 6 then  '** '
       end dice
from sysibm.sysdummy1
) gm
On 1 = 1
;
:diablo: :good:
  • 0

#4 LKhiger

LKhiger

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Леонид Хигер
  • Город:NY

Отправлено 13 октября 2010 - 12:01

Случайные перестановки букв в слове:

with Input (word) as 
(select 'database2' from sysibm.sysdummy1
)
,
RandCharOrder (randword, remword, k) as
(select varchar('', 1000), strip(word), length(word)  
   from Input
union all
select randword || substr(remword, pos, 1), 
case when pos = 1 and length(remword) > 1
     then substr(remword, pos + 1)
     when length(remword) = 1
     then remword
     else substr(remword, 1, pos - 1) || substr(remword, pos + 1)
end, ch.k - 1
from RandCharOrder ch, Input, 
table
(select randint(length(remword) - 1) + 1 pos, ch.k
from sysibm.sysdummy1 ) rr

Where length(remword) > 0 and ch.k - 1 >= 0 
) 
select word, randword from RandCharOrder, Input
where k = 0
:focus:
  • 0

#5 greesha

greesha

    Опытный участник

  • Members
  • PipPipPipPip
  • 363 сообщений
  • ФИО:Печёнкин Григорий Михайлович
  • Город:Мытищи

Отправлено 13 октября 2010 - 12:52

Испытайте сами на своём компьютере и убедитесь как близко математическое ожидание к середине


А что, функция RAND возвращает случайное число?
Или всё-таки псевдослучайное? ;)
  • 0
Григорий Печёнкин
greesha.ru
жежешечка

#6 LKhiger

LKhiger

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Леонид Хигер
  • Город:NY

Отправлено 14 октября 2010 - 03:22


Испытайте сами на своём компьютере и убедитесь как близко математическое ожидание к середине


А что, функция RAND возвращает случайное число?
Или всё-таки псевдослучайное? ;)

Здравствуйте !

Приятная неожиданность. Я здесь не один ! :good:

Конечно псевдослучайное. Но на это можно не обращать внимание.

Когда я в 1994 году для одной солидной американской компании делал проект, в котором потребовалась случайная выборка, а DB2 версия 3 не имела функции RAND(), я сам создал такую "функцию" и все были счастливы.

Хотя и UDF функций тогда не было.

:ok: Работаем с тем, что имеем. :ok:

Lenny
  • 0

#7 LKhiger

LKhiger

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Леонид Хигер
  • Город:NY

Отправлено 16 октября 2010 - 10:22

Change RandInt function, override RandInt

The function RandInt(integer) is working now in intervals:
[0, X] when X > 0
[X, 0] when X < 0
[0, 1] when X in (0, 1)

drop function RandInt(integer);

CREATE FUNCTION RandInt (X integer) 
RETURNS integer 
LANGUAGE SQL 
CONTAINS SQL 
NO EXTERNAL ACTION 
not DETERMINISTIC 
RETURN 
case when X = 0 
then int(1 * Rand() + .5)
else int(X * Rand() + 0.5 * sign(X))
end
;

The function RandInt(integer, integer) is overriding RandInt(integer) and
working in intervals:
[start#, end#] when end# >= start#
[end#, start#] when end# <= start#

CREATE FUNCTION RandInt (start# integer, end# integer) 
RETURNS integer 
LANGUAGE SQL 
CONTAINS SQL 
NO EXTERNAL ACTION 
not DETERMINISTIC 
RETURN RandInt(end# - start#) + start#;

What could be also interesting to us:
Create statement of RandInt(integer, integer) function consists call to
parent function RandInt(integer).

Example of using new functions:

select 
randint(500) int1, randint(1000) int2, randint(500, 1000) int3
from sysibm.sysdummy1;

  • 0

#8 LKhiger

LKhiger

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Леонид Хигер
  • Город:NY

Отправлено 17 октября 2010 - 13:19

Сенсация: одни и те же номера выпали в "Лото" два раза за месяц

В минувшую субботу состоялся очередной розыгрыш лотереи "Лото". Выиграли номера 13, 14, 26, 32, 33 и 36. Следует отметить, что те же самые числа выпадали на розыгрыше, состоявшемся менее месяца назад – 21 сентября.

По мнению специалистов, статистическая вероятность такого события составляет 0,00000000000025.

При этом число победителей оказалось намного больше обычного.
Не менее 92 человек решили, что выигравшие один раз числа выпадут снова, и отметили их.
Правда, лишь трое из них угадали дополнительный номер – 2 (миспар хазак), и каждый из них получит по четыре миллиона шекелей. Дополнительный номер, выпавший в сентябре, был 1.

Число угадавших правильно 5 номеров и дополнительный составило 14 человек, каждый из них получит 6.561 шекелей.

http://www.newsru.co...0/loto8005.html

Вопрос: :rtfm:
Правильно ли "учёные" подсчитали вероятность этого события ?
  • 0

#9 felix

felix

    Постоянный участник

  • Members
  • PipPipPip
  • 184 сообщений
  • ФИО:Зинатуллин Феликс
  • Город:Санкт-Петербург

Отправлено 18 октября 2010 - 10:14

Сенсация: одни и те же номера выпали в "Лото" два раза за месяц

В минувшую субботу состоялся очередной розыгрыш лотереи "Лото". Выиграли номера 13, 14, 26, 32, 33 и 36. Следует отметить, что те же самые числа выпадали на розыгрыше, состоявшемся менее месяца назад – 21 сентября.

По мнению специалистов, статистическая вероятность такого события составляет 0,00000000000025.

При этом число победителей оказалось намного больше обычного.
Не менее 92 человек решили, что выигравшие один раз числа выпадут снова, и отметили их.
Правда, лишь трое из них угадали дополнительный номер – 2 (миспар хазак), и каждый из них получит по четыре миллиона шекелей. Дополнительный номер, выпавший в сентябре, был 1.

Число угадавших правильно 5 номеров и дополнительный составило 14 человек, каждый из них получит 6.561 шекелей.

http://www.newsru.co...0/loto8005.html

Вопрос: :rtfm:
Правильно ли "учёные" подсчитали вероятность этого события ?

Розыгрыши раз в неделю? Сколько было розыгрышей между совпадениями?
  • 0
http://live-in-felix.blogspot.com/
Testing: manual expert, automation junior

#10 ch_ip

ch_ip

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 097 сообщений
  • ФИО:Павел Абдюшев
  • Город:Москва


Отправлено 18 октября 2010 - 18:35

Сенсация: одни и те же номера выпали в "Лото" два раза за месяц
Вопрос: :rtfm:
Правильно ли "учёные" подсчитали вероятность этого события ?

Я так понимаю, что каждый розыгрыш - событие независимое, а посему вероятность выпадения любой комбинации одинакова и составляет 1/(число всех вероятных комбинаций).
Это как с монеткой. Даже если до этого 10 раз выпал орел, вероятность получить орла в следующей попытке составляет 1/2.
  • 0

#11 LKhiger

LKhiger

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Леонид Хигер
  • Город:NY

Отправлено 19 октября 2010 - 01:50

Отличный ответ ! Я тоже так думал изначально. :good:

Но почему тогда весь мир дружно говорит о чуде ? :clapping:

Откуда:

По мнению специалистов, статистическая вероятность такого события составляет 0,00000000000025


И я понял откуда взялось это решение:

Эта вероятность такого события как смешение двух барабанов с одинаковым набором шаров, в одном барабане, и доставания из общего барабана ряда попарно равных шаров.

А это уже совершенно другое число.
  • 0

#12 LKhiger

LKhiger

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Леонид Хигер
  • Город:NY

Отправлено 23 октября 2010 - 19:36

Change RandInt function, override RandInt

The function RandInt(integer) is working now in intervals:
[0, X] when X > 0
[X, 0] when X < 0
[0, 1] when X in (0, 1)

drop function RandInt(integer);

CREATE FUNCTION RandInt (X integer) 
RETURNS integer 
LANGUAGE SQL 
CONTAINS SQL 
NO EXTERNAL ACTION 
not DETERMINISTIC 
RETURN 
case when X = 0 
then int(1 * Rand() + .5)
else int(X * Rand() + 0.5 * sign(X))
end
;

The function RandInt(integer, integer) is overriding RandInt(integer) and
working in intervals:
[start#, end#] when end# >= start#
[end#, start#] when end# <= start#

CREATE FUNCTION RandInt (start# integer, end# integer) 
RETURNS integer 
LANGUAGE SQL 
CONTAINS SQL 
NO EXTERNAL ACTION 
not DETERMINISTIC 
RETURN RandInt(end# - start#) + start#;

What could be also interesting to us:
Create statement of RandInt(integer, integer) function consists call to
parent function RandInt(integer).

Example of using new functions:

select 
randint(500) int1, randint(1000) int2, randint(500, 1000) int3
from sysibm.sysdummy1;

  • 0

#13 LKhiger

LKhiger

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Леонид Хигер
  • Город:NY

Отправлено 23 октября 2010 - 19:54

Dice game / two players / 3 dices

We will use the RandInt(m, n) function, because of dice has numbers (in random sequence)
from 1 to 6, so it will be RandInt(1, 6) for each dice:


Select 
player1.dice1, player1.dice2, player1.dice3, 
player2.dice1, player2.dice2, player2.dice3, 
(player1.dice1 + player1.dice2 + player1.dice3) player1,
(player2.dice1 + player2.dice2 + player2.dice3) player2,
case when (player1.dice1 + player1.dice2 + player1.dice3) >
          (player2.dice1 + player2.dice2 + player2.dice3)
     then 'Player1  WIN !' 
     when (player1.dice1 + player1.dice2 + player1.dice3) <
          (player2.dice1 + player2.dice2 + player2.dice3)
     then 'Player2  WIN !' 
     else 'Tie (draw)' 
end result   
from
(select randint(1, 6) dice1, randint(1, 6) dice2, randint(1, 6) dice3
from sysibm.sysdummy1) player1
,
(select randint(1, 6) dice1, randint(1, 6) dice2, randint(1, 6) dice3
from sysibm.sysdummy1) player2 

  • 0

#14 LKhiger

LKhiger

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Леонид Хигер
  • Город:NY

Отправлено 27 октября 2010 - 03:14

Интересно создать ещё одну функцию RandInt() , которая действует на всём интервале целых чисел:

CREATE FUNCTION RandInt()
RETURNS integer 
LANGUAGE SQL 
CONTAINS SQL 
NO EXTERNAL ACTION 
not DETERMINISTIC 
RETURN RandInt(-2147483648, 2147483647);

Эта функция без аргументов.

Интересно изучить её поведение. Даёт ли она целое близкое к 0 ?
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных