Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Опыты по Теории Вероятностей, Иммитация случайных событий 
:(
    Опции темы
LKhiger
  Дата 11.10.2010, 05:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 7.9.2009

Репутация: 2
Всего: 2



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

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

Код

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 раз), чтобы найти Математическое Ожидание. smile 

Наверное устанем, если не используем возможности DB2 smile 

Код

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.

PM MAIL   Вверх
Akina
Дата 11.10.2010, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Это он к чему?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
LKhiger
  Дата 11.10.2010, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 7.9.2009

Репутация: 2
Всего: 2



Нет, прав был Ленин.

Учиться, учиться и ещё раз учиться !  smile 

Надо кой-кому ! smile 
PM MAIL   Вверх
Akina
Дата 11.10.2010, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Да учись, ради бога. Только сюда-то зачем всё это вываливать?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
LKhiger
  Дата 11.10.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 7.9.2009

Репутация: 2
Всего: 2



Цитата(Akina @ 11.10.2010,  14:21)
Да учись, ради бога. Только сюда-то зачем всё это вываливать?

Не читай, если не понимаешь.

Будь демократичен, хотя бы к себе.

А это предверие к Теории Игр, где всё, как известно, случайно, если ты не шулер.

Вот, например игра в карты. Игрокам приходят карты случайным образом.

С помощью DB2 можно смоделировать ситуацию. 

Или лотерея. Как предсказать результат ?
PM MAIL   Вверх
LKhiger
  Дата 11.10.2010, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 7.9.2009

Репутация: 2
Всего: 2



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

Как известно, может выпасть от 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;

PM MAIL   Вверх
Akina
Дата 11.10.2010, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Цитата(LKhiger @  11.10.2010,  16:51 Найти цитируемый пост)
Вот, например игра в карты. Игрокам приходят карты случайным образом.

При раздаче программным путём - да. И то, если в раздачу не введён перекос. А в реальности - никогда.

Цитата(LKhiger @  11.10.2010,  16:51 Найти цитируемый пост)
С помощью DB2 можно смоделировать ситуацию. 

С помощью того, что описано, можно моделировать только идеальный процесс. И то с определёнными допусками... скажем, моделируете Вы своим кодом какой-то РЕАЛЬНЫЙ случайный процесс - Вы готовы давать гарантии, что средний (любой из) разброс моделируемого процесса ровно такой же, какой даст ГСЧ  в DB2?

Я уже однажды проходил это на практике - выполнялся процесс моделирования игрового действия на сервере, в котором (в процессе на сервере) как раз интенсивно использовался ГСЧ. Так вот - программа, написанная на BC, процесс моделировала прекрасно, а совершенно тот же код, но на TP, давал абсолютно хреновые результаты.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
LKhiger
  Дата 11.10.2010, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 7.9.2009

Репутация: 2
Всего: 2



Цитата(Akina @ 11.10.2010,  16:39)
Цитата(LKhiger @  11.10.2010,  16:51 Найти цитируемый пост)
Вот, например игра в карты. Игрокам приходят карты случайным образом.

При раздаче программным путём - да. И то, если в раздачу не введён перекос. А в реальности - никогда.

Цитата(LKhiger @  11.10.2010,  16:51 Найти цитируемый пост)
С помощью DB2 можно смоделировать ситуацию. 

С помощью того, что описано, можно моделировать только идеальный процесс. И то с определёнными допусками... скажем, моделируете Вы своим кодом какой-то РЕАЛЬНЫЙ случайный процесс - Вы готовы давать гарантии, что средний (любой из) разброс моделируемого процесса ровно такой же, какой даст ГСЧ  в DB2?

Я уже однажды проходил это на практике - выполнялся процесс моделирования игрового действия на сервере, в котором (в процессе на сервере) как раз интенсивно использовался ГСЧ. Так вот - программа, написанная на BC, процесс моделировала прекрасно, а совершенно тот же код, но на TP, давал абсолютно хреновые результаты.

Вот здесь я уже полностью с вами согласен !

Хороший генератор случайных чисел ещё не создан.

Но как я убедился на большом количстве испытаний и этот генератор работает не плохо.

Так математическое ожидание и среднее квадратическое отклонение в норме для 10000 испытаний:

Код

with prob (k, maxK, prb, total, totsqr) as
(select 0, 10000, 1, 0, 0 
   from sysibm.sysdummy1
union all
select pb.k + 1, maxK, prb, total + rnd, 
       totsqr + power(rnd, 2)
from prob pb, 
table
(select randint(prb) rnd, pb.k
from sysibm.sysdummy1 ) rr
where pb.k + 1 <= maxK

select maxK, strip(char(total)) || ' to ' || char(maxK * prb) chance_to_win, 
sqrt(totsqr * 1. / maxK - power((total * 1. / maxK), 2)) 
     as Standard_Deviation 
from prob
where k = maxK; 

PM MAIL   Вверх
LKhiger
  Дата 11.10.2010, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 7.9.2009

Репутация: 2
Всего: 2



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


Код

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
;




Это сообщение отредактировал(а) LKhiger - 11.10.2010, 19:20
PM MAIL   Вверх
LKhiger
  Дата 13.10.2010, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 7.9.2009

Репутация: 2
Всего: 2



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

Код

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
;

PM MAIL   Вверх
LKhiger
  Дата 16.10.2010, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 7.9.2009

Репутация: 2
Всего: 2



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;



Это сообщение отредактировал(а) LKhiger - 23.10.2010, 22:38
PM MAIL   Вверх
LKhiger
  Дата 17.10.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 7.9.2009

Репутация: 2
Всего: 2



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

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

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

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

http://www.newsru.co.il/israel/17oct2010/loto8005.html

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

PM MAIL   Вверх
LKhiger
  Дата 23.10.2010, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 7.9.2009

Репутация: 2
Всего: 2



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 

PM MAIL   Вверх
LKhiger
  Дата 27.10.2010, 06:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 7.9.2009

Репутация: 2
Всего: 2



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

Код

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


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

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

Это сообщение отредактировал(а) LKhiger - 27.10.2010, 06:07
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Другие СУБД | Следующая тема »


 




[ Время генерации скрипта: 0.1284 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.