Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Математический эксперимент


Автор: Metalex 17.3.2009, 18:23
В общем целью было проверить, действительно ли при больших кол-вах экспериментов с подкиданием монеты, количества выпаданий герба и числа особо не отличаются и стремятся к вероятности 0.5
Кидаем 1000 раз. Почему то постоянно один и тот же результат. Почему?

Код
Program PerevirkaMatematuchnoiTeorii;
Var k,k1,k2:word; i:integer;
Begin
k1:=0; k2:=0;
for i:=1 to 1000 do
begin
k:=random(2);
if k=0 then k1:=k1+1;
end;
k2:=1000-k1;
writeln ('Випало ',k1,' разів число і ',k2,' разів герб');
readln;
end.


Ноль - это число (решка), единица - герб (орел).

Автор: THandle 17.3.2009, 18:44
Metalex, randomize в начале вызови... 

Автор: Bobrina 17.3.2009, 20:47
Код

Program Money;
var a,a1,b,i:Integer;
Begin
Randomize;
For i:=1 to 1000 do
begin
a:=Random(2);
if a=0 then a1:=a1+1;
end;
WriteLn('Vipalo reshek:',a1);
ReadLn;
End.

Выпадает по 509-579, пробовал раз 20.

Добавлено через 52 секунды
А без randomize, Random(2) выдаёт всегда 0.

Автор: AXOXC 17.3.2009, 21:38
Вобщем попробуй просто повыводить числа без подключения "Randomize" тама дается "0 0 1 2.." причем всегда

Библиотека Randomize нужна чтобы присвайвалось значение зависящие от аппаратного времени в миллисикундах если неошибаюсь тобиш по строгому алгоритму) При подкидование монетки шанс выпадаения зависит от множества факторов (теория вероятности) и математически считается всетаки довольно сложно:(

Автор: Metalex 17.3.2009, 22:11
Вот надо же smile пропустил randomize. Бывает) Всем спс.

Просто мы на уроке поспорили с училкой, что из 1000 раз число может выпасть 300. Она утверждала, что нет - мы, что может. Теперь я понял, что не может. Но ведь теоретически то может?

Автор: volvo877 17.3.2009, 22:22
Цитата(AXOXC @  17.3.2009,  20:38 Найти цитируемый пост)
тама дается "0 0 1 2.." причем всегда
"Тама" 2 вообще никак не присутствует, потому как явно указано: от 0 до 2 (НЕ включая 2)...


Цитата(AXOXC @  17.3.2009,  20:38 Найти цитируемый пост)
Библиотека Randomize нужна чтобы присвайвалось значение зависящие от аппаратного времени в миллисикундах
Во-первых, не библиотека, а процедура. А во-вторых, нужна она только для начальной инициализации ГПСЧ, и ни для чего больше. Если не использовать Randomize, то при нескольких подряд запусках одной и той же программы будешь получать одинаковые результаты. Удобно для отладки, но неприменимо для эксперимента.

Цитата(Metalex @  17.3.2009,  21:11 Найти цитируемый пост)
Но ведь теоретически то может? 
Теоретически - не может. Может только практически. Можно и при 10 подбрасываниях монеты получить 10 "орлов" (практически), хотя с точки зрения теории вероятностей это очень маловероятное событие (для разминки - можешь попробовать посчитать его вероятность smile ).

Автор: Kbl4AH 17.3.2009, 23:53
Цитата(volvo877 @  17.3.2009,  22:22 Найти цитируемый пост)
Теоретически - не может. Может только практически.

противоречиво

Добавлено @ 23:57
Цитата(Metalex @  17.3.2009,  22:11 Найти цитируемый пост)
Просто мы на уроке поспорили с училкой, что из 1000 раз число может выпасть 300.

может с вероятностью 30 % smile

Добавлено @ 00:02
ЗЫ. Вроде рандомизатор не является объективным подтверждением тервера...
volvo877, уточни, пожалуйста, насчет рандомизатора в программировании...
Насколько мне помнится, то он - псевдослучайный (то есть не идеальная случайность, а какая-то зависимость)...
Правильно или нет? А в реальной жизни решка без напрягов может выпасть несколько раз подряд...
Имхо, эта прога не подтверждение в данном споре... 

Автор: AXOXC 18.3.2009, 13:44
Цитата(volvo877 @  17.3.2009,  22:22 Найти цитируемый пост)
"Тама" 2 вообще никак не присутствует, потому как явно указано: от 0 до 2 (НЕ включая 2)...


"тама" имелось в виду что если мы будим выполнять подряд несколько присваиванфий без randomize


//for i:=1 to n do a[i]:=random(maxlongint);

то при каждом запуске программы будем получать одинаковые массивы типа {0,0,1,2..}

в данном случае "random(2)" при каждом запуске получаем "0" т.к. значения видимо округляюца:(

Прошу прощения за неточность а придыдущем посте)

P. C. Одно из условий получения идиального рандома если неошибаюсь чтобы "количество любых значений полученых в ходе эксперимента было примерно равно" В паскаль это выполняется Например можно написать программу которая присваевает переменным масива значения от 1 до 5 и на каждом шаге выдает количество единиц двоек троек и пятерок) Нащет монет: можно попробывать найти условие/копилятор с неидельным рандомом при котором будет выдавать значения например 300/700 и т. д.



Автор: Kbl4AH 18.3.2009, 14:09
Цитата(AXOXC @  18.3.2009,  13:44 Найти цитируемый пост)
Одно из условий получения идиального рандома если неошибаюсь чтобы "количество любых значений полученых в ходе эксперимента было примерно равно"

Но выбор нового вероятного значения в тервере (в реальном мире) не должен зависеть от предыдущего значения... 
А в рандомизаторе - зависит, чтобы выбранные значения были максимально различными...

Автор: AXOXC 18.3.2009, 14:28
Хм есть предложение а если присваевоемое значение будет зависеть от реальной случайности(например от человека сидящего у компьютера)

например

Пользователь в ходе программы нажымает клавишу 10 раз и значение переменной зависит от пайзы между нажатиями в милисекундах (четное-1 нечетное-0)
К сожалению не могу на данный момент реализовать т. к. не знаю как заставить паскаль работать со временем(

Автор: petru4o 18.3.2009, 16:47
AXOXC, оператор delay(время в миллисекундах)

Автор: AXOXC 18.3.2009, 17:43
Цитата(petru4o @  18.3.2009,  16:47 Найти цитируемый пост)
AXOXC, оператор delay(время в миллисекундах) 


Ето задержка в выполнение программы.

Автор: Metalex 18.3.2009, 18:41
Цитата(Kbl4AH @ 17.3.2009,  23:53)
Имхо, эта прога не подтверждение в данном споре...

А как же проверить? Я же не буду подбрасывать 1000 раз smile Хотя один хлопец уже 300 раз бросил)

Автор: Kbl4AH 18.3.2009, 21:37
Цитата(Metalex @  18.3.2009,  18:41 Найти цитируемый пост)
А как же проверить? Я же не буду подбрасывать 1000 раз  Хотя один хлопец уже 300 раз бросил)

блин, вы че... вероятность того, что орел будет 300 раз из тысячи точно такая же как что орел выпадет 3 раза из десяти... я 3 раза по 10 раз подбросил, на третий раз орел 3 раза только выпал... вот собственно и все... если училка сильно лезет в лупу, то возьми учебник по тер. веру, посмотри формулу, сделай несложный расчет и ткни училке...

Автор: Metalex 19.3.2009, 10:51
Не в училке дело)

Автор: petru4o 19.3.2009, 17:29
AXOXC, а тебе что надо? ты от этого плясать будешь.

Автор: AXOXC 20.3.2009, 15:54
Цитата(petru4o @  19.3.2009,  17:29 Найти цитируемый пост)
AXOXC, а тебе что надо? ты от этого плясать будешь. 

ээээ как?

Автор: petru4o 20.3.2009, 16:20
AXOXC, это так,что ты от этого оператора и будешь работать с временем.на сколько знаю,другого метода работы с временем в паскале и нет.

Автор: AXOXC 21.3.2009, 12:45
хм задача поймать время между нажатиями клавиш пользователями (поймать "извне" какое либо значение) как нам тут delay поможет?

Автор: volvo877 21.3.2009, 15:07
Цитата(petru4o @  20.3.2009,  15:20 Найти цитируемый пост)
на сколько знаю,другого метода работы с временем в паскале и нет. 
Это - твои личные проблемы... Иди и читай доки, если чего-то не знаешь. В Паскале много чего есть, что тебе даже и не снилось...

Цитата(AXOXC @  21.3.2009,  11:45 Найти цитируемый пост)
как нам тут delay поможет? 
Это не тема данного топика. Если интересно - создай новый, или ХОТЯ БЫ посмотри текущую страницу раздела - не далее как 18-го числа вопрос о работе со временем задавался. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)