powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Опыты по Теории Вероятностей
21 сообщений из 21, страница 1 из 1
Опыты по Теории Вероятностей
    #36891815
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Опыты по Теории Вероятностей

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
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 - орёл.

Подбросим монетку:

Код: plaintext
1.
2.
3.
4.
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 раз), чтобы найти Математическое Ожидание.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
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 / 0
Опыты по Теории Вероятностей
    #36893174
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Моделирование броска кости.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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 / 0
Опыты по Теории Вероятностей
    #36893192
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Моделирование броска кости.

Как известно, может выпасть от 1 до 6:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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 / 0
Опыты по Теории Вероятностей
    #36893488
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Моделирование броска кости.

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


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
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 
;
...
Рейтинг: 0 / 0
Опыты по Теории Вероятностей
    #36897400
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Случайные перестановки букв в слове:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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 
...
Рейтинг: 0 / 0
Опыты по Теории Вероятностей
    #36902961
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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#

Код: plaintext
1.
2.
3.
4.
5.
6.
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:

Код: plaintext
1.
2.
select 
randint( 500 ) int1, randint( 1000 ) int2, randint( 500 ,  1000 ) int3
from sysibm.sysdummy1;
...
Рейтинг: 0 / 0
Опыты по Теории Вероятностей
    #36903933
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сенсация: одни и те же номера выпали в "Лото" два раза за месяц

В минувшую субботу состоялся очередной розыгрыш лотереи "Лото". Выиграли номера 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

Вопрос:
Правильно ли "учёные" подсчитали вероятность этого события ?
...
Рейтинг: 0 / 0
Опыты по Теории Вероятностей
    #36916231
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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#

Код: plaintext
1.
2.
3.
4.
5.
6.
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:

Код: sql
1.
2.
select 
randint(500) int1, randint(1000) int2, randint(500, 1000) int3
from sysibm.sysdummy1;
...
Рейтинг: 0 / 0
Опыты по Теории Вероятностей
    #36916249
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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 / 0
Опыты по Теории Вероятностей
    #36916253
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторRETURN int(X * Rand() + .5);

Так RandInt(1) иммитирует бросание монеты: 0 - решка, 1 - орёл.
С RandInt(1) все верно. А дальше?

Rand() - число от 0 до 1

2 * Rand() - число от 0 до 2

2 * Rand() + 0.5 - число от 0.5 до 2.5

int(2 * Rand() + 0.5):
- для чисел [0.5; 1) даст 0 (1/4 всего интервала);
- для чисел [1; 2) даст 1 (1/2 всего интервала);
- для чисел [2; 2.5] даст 2 (1/4 всего интервала).

И это по-вашему равномернораспределенное подбрасывание трехгранного кубика?
...
Рейтинг: 0 / 0
Опыты по Теории Вероятностей
    #36916331
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Edd.DragonавторRETURN int(X * Rand() + .5);

Так RandInt(1) иммитирует бросание монеты: 0 - решка, 1 - орёл.
С RandInt(1) все верно. А дальше?

Rand() - число от 0 до 1

2 * Rand() - число от 0 до 2

2 * Rand() + 0.5 - число от 0.5 до 2.5

int(2 * Rand() + 0.5):
- для чисел [0.5; 1) даст 0 (1/4 всего интервала);
- для чисел [1; 2) даст 1 (1/2 всего интервала);
- для чисел [2; 2.5] даст 2 (1/4 всего интервала).

И это по-вашему равномернораспределенное подбрасывание трехгранного кубика?
Вы забыли кое-что: INT: Function RETURN int(X * Rand() + .5)
Следовательно: 2 * Rand() + 0.5 - число от 0.5 до 2.5 ==>
RandInt(2) = int(2 * Rand() + 0.5) - число от 0 до 2
...
Рейтинг: 0 / 0
Опыты по Теории Вероятностей
    #36916338
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lkhiger
Вы забыли кое-что: INT: Function RETURN int(X * Rand() + .5)
Следовательно: 2 * Rand() + 0.5 - число от 0.5 до 2.5 ==>
RandInt(2) = int(2 * Rand() + 0.5) - число от 0 до 2

Да я что спорю!? Конечно от 0 до 2. Я в точности это же и написал, не?

Я- для чисел [0.5; 1) даст 0 (1/4 всего интервала);
- для чисел [1; 2) даст 1 (1/2 всего интервала);
- для чисел [2; 2.5] даст 2 (1/4 всего интервала).

А теперь все-таки прочтите без спешки и поймите смысл этой цитаты. В ней сказано, что функция (как вы и задумали) возвращает в этом случае 0, 1 или 2. Но кроме этого показано, в СКОЛЬКИХ случаях она вернет 0, в скольких 1, и в скольких 2. Из 1000 чисел примерно 250 раз выпадет 0, 250 раз 2, и целых 500 раз единица.
...
Рейтинг: 0 / 0
Опыты по Теории Вероятностей
    #36916375
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Edd.DragonLkhiger
Вы забыли кое-что: INT: Function RETURN int(X * Rand() + .5)
Следовательно: 2 * Rand() + 0.5 - число от 0.5 до 2.5 ==>
RandInt(2) = int(2 * Rand() + 0.5) - число от 0 до 2

Да я что спорю!? Конечно от 0 до 2. Я в точности это же и написал, не?

Я- для чисел [0.5; 1) даст 0 (1/4 всего интервала);
- для чисел [1; 2) даст 1 (1/2 всего интервала);
- для чисел [2; 2.5] даст 2 (1/4 всего интервала).

А теперь все-таки прочтите без спешки и поймите смысл этой цитаты. В ней сказано, что функция (как вы и задумали) возвращает в этом случае 0, 1 или 2. Но кроме этого показано, в СКОЛЬКИХ случаях она вернет 0, в скольких 1, и в скольких 2. Из 1000 чисел примерно 250 раз выпадет 0, 250 раз 2, и целых 500 раз единица.
Красивое рассуждение ! Вы забыли, однако, что 0.5 действует на всех интервалах, поэтому то орёл/решка выпадают равномерно.

Можно было записать формулу и по-иному, так:
Код: plaintext
RandInt(X) = Round(X * rand(), 0)
Или так:
Код: plaintext
RandInt(X) = X * rand() + rand()

Но это не сильно бы повлияло на результат.
...
Рейтинг: 0 / 0
Опыты по Теории Вероятностей
    #36918055
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lkhiger
Красивое рассуждение ! Вы забыли, однако, что 0.5 действует на всех интервалах, поэтому то орёл/решка выпадают равномерно.

Мда...

Орел решка, т.е. 0-1 логично что выпадают равномерно! И это я тоже в самом начале написал. А вы в упор не видите, что в остальных случаях (т.е. начиная с 0-1-2) равномерности нет и быть не может. Я же пошагово расписал/разжевал как так выходит. А вы мне в ответ воду льете мол, "фигня и неправда". Где ошибка в моих рассуждениях - тыкните носом и покажите как будет.

Не заставляйте меня в третий раз повторять ту же цитату, в смысл которой вы упорно не хотите вникнуть. Почему я должен вам доказываить то, что очевидно и что вы сами в состоянии проверить. Подбросте трех- или более гранную кость и посчитайте сколько каких значений у вас выпало. Поровну?

Вот результаты 10 000 подбрасываний от 2 до 6 граней:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
 0 :   5092 
 1 :   4908 

======

 0 :   2474 
 1 :   5050 
 2 :   2476 

======

 0 :   1660 
 1 :   3285 
 2 :   3400 
 3 :   1655 

======

 0 :   1230 
 1 :   2453 
 2 :   2509 
 3 :   2553 
 4 :   1255 

======

 0 :   991 
 1 :   2010 
 2 :   1975 
 3 :   2048 
 4 :   2004 
 5 :   972 

Сами же могли проверить прежде чем возражать.

________________________________________________________________


авторМожно было записать формулу и по-иному, так:
RandInt(X) = Round(X * rand(), 0)
Но это не сильно бы повлияло на результат.
Точно! Крайних значений снова будет вдвое меньше, чем средних! )))
...
Рейтинг: 0 / 0
Опыты по Теории Вероятностей
    #36918074
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А делать можно например так:

Floor((X + 1) * Rand());

В таком случае при X = 2 получим случайное число от 0 до 3 (не включая 3) и далее
- [0; 1) округляется до 0;
- [1; 2) округляется до 1;
- [2; 3) округляется до 2.

Ровно 3 никогда не будет. Т.к. если верить мануалу ( http://msdn.microsoft.com/en-us/library/ms177610.aspx ) RAND возвращает число от 0 до 1, не включая единицу, т.е. от 0 до 0.9999...
...
Рейтинг: 0 / 0
Опыты по Теории Вероятностей
    #36918382
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Edd.DragonА делать можно например так:

Floor((X + 1) * Rand());

В таком случае при X = 2 получим случайное число от 0 до 3 (не включая 3) и далее
- [0; 1) округляется до 0;
- [1; 2) округляется до 1;
- [2; 3) округляется до 2.

Ровно 3 никогда не будет. Т.к. если верить мануалу ( http://msdn.microsoft.com/en-us/library/ms177610.aspx ) RAND возвращает число от 0 до 1, не включая единицу, т.е. от 0 до 0.9999...
Отличная работа ! Правда я не вижу разницы между FLOOR и INT.

А как себя ведёт функция, когда Х = 0, или Х = -1 ?

Поэтому предлагаю:
Код: plaintext
1.
2.
3.
RandInt (X) = 
CASE WHEN X in (0, 1) THEN int(RAND() + RAND())
         ELSE int(X * RAND() + SIGN(X) * RAND())
END
...
Рейтинг: 0 / 0
Опыты по Теории Вероятностей
    #36918422
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
RandInt (X) = 
CASE WHEN X in (0, 1) THEN int(RAND() + RAND(1))         
ELSE int(X * RAND() + SIGN(X) * RAND(1))
END
...
Рейтинг: 0 / 0
Опыты по Теории Вероятностей
    #36921667
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lkhiger
Правда я не вижу разницы между FLOOR и INT.

Заигрался и забыл поменять

Lkhiger
А как себя ведёт функция, когда Х = 0, или Х = -1 ?

Поэтому предлагаю:
Код: plaintext
1.
2.
3.
RandInt (X) = 
CASE WHEN X in (0, 1) THEN int(RAND() + RAND())
         ELSE int(X * RAND() + SIGN(X) * RAND())
END

При нуле смысл функции - вернуть случайное число от 0 до X=0, т.е. 0.

При отрицательном нужно сделать тоже, что и при положительном, но вернуть результат с минусом.

Ваш же вариант для такого случая
Код: plaintext
ELSE int(X * RAND() + SIGN(X) * RAND())
вы получается снова предложили, не проверив.

Покажите сколько каких значений в диапазоне [-4; 0] по вашей формуле выпадет при 10 000 подбрасываний.
...
Рейтинг: 0 / 0
Опыты по Теории Вероятностей
    #36921673
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стоп! Прошу прощения, то я уже накосячил. Конечно, все верно.

Только нужен один рендом, а то сумма N величин распределенных по равномерному закону (рендомы) стремится к величине распределенной по нормальному закону (при достаточно большом N). Т.е. суммируя несколько рендомов мы портим равномерность распределения.

Код: plaintext
int((X + SIGN(X)) * RAND())
...
Рейтинг: 0 / 0
Опыты по Теории Вероятностей
    #36921829
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Edd.DragonСтоп! Прошу прощения, то я уже накосячил. Конечно, все верно.

Только нужен один рендом, а то сумма N величин распределенных по равномерному закону (рендомы) стремится к величине распределенной по нормальному закону (при достаточно большом N). Т.е. суммируя несколько рендомов мы портим равномерность распределения.

Код: plaintext
int((X + SIGN(X)) * RAND())

Ok, but....

При Х = 0 неопределённость исчезает, однако....
...
Рейтинг: 0 / 0
Опыты по Теории Вероятностей
    #36921837
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Интересно создать ещё одну функцию
Код: plaintext
RandInt () 
, которая действует на всём интервале целых чисел:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE FUNCTION RandInt () 
RETURNS integer 
LANGUAGE SQL 
CONTAINS SQL 
NO EXTERNAL ACTION 
not DETERMINISTIC 
RETURN RandInt(- 2147483648 ,  2147483647 );

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

Интересно изучить её поведение. Даёт ли она целое близкое к 0 ?
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Опыты по Теории Вероятностей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]