Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2014, 19:52   #1
1450
 
Регистрация: 29.02.2012
Сообщений: 3
По умолчанию ГСЧ борется сам с собой

Дано:
1) Label на форме;
2)
Код:
var
SpinsCount,bet,spin,i,Win:integer;
begin
SpinsCount:=10000;
Win:=strtoint(Label1.Caption);
for i := 1 to SpinsCount do
begin
  Randomize;
  spin:=Random(2);
  bet:=Random(2);
  If bet = spin Then Win := Win+1
  Else Win := Win-1;
end;
Label1.Caption:=inttostr(Win);
end;
По моему представлению переменная Win должна по мере бОльшего и бОльшего кол-ва запусков стремиться к 0. Однако она либо начинает расти, либо начинает ползти вниз. Вопрос - почему, и как сделать то что я хочу?

UPD: Есть подозрения, что мой ГСЧ не такой уж ГСЧ. Но все же - в чем причина именно либо положительной, либо отрицательной динамики?

Последний раз редактировалось 1450; 05.02.2014 в 19:58.
1450 вне форума Ответить с цитированием
Старый 05.02.2014, 20:05   #2
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

1) Что такое ГСЧ? Просьба использовать общепринятый Русский язык без сокращения слов при формировании вопросов/ответов.
2) Задача какая? При формировании ответа смотрим первый пункт.
3) Ну и так, чисто для себя. А что значит UPD?
doktor255 вне форума Ответить с цитированием
Старый 05.02.2014, 20:12   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...рекомендовал бы в качестве ГПСЧ использовать линейный конгруэнтный метод или вихрь Мерсенна.

И да, ваш ГСЧ не ГСЧ, а псевдо ГСЧ, причем хреновый. Хотите реальный ГСЧ - используйте шумящие биты АЦП аудиокарты, к примеру.

Цитата:
Что такое ГСЧ? Просьба использовать общепринятый Русский язык без сокращения слов при формировании вопросов/ответов.
ГСЧ - это общепринятый технический термин.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 05.02.2014, 20:57   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от doktor255 Посмотреть сообщение
1) Что такое ГСЧ?
ГСЧ, это - Генератор Случайных Чисел.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 05.02.2014, 21:20   #5
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,596
По умолчанию

Во-первых, вы ошиблись на счет стремления переменной к нулю. У вас 50 на 50 +1 или -1.
Во-вторых, вынесите Randomize из цикла.
В-третьих, у вас не ГСЧ, а ГПСЧ. И этим все объясняется.
Arigato вне форума Ответить с цитированием
Старый 05.02.2014, 21:32   #6
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Цитата:
Сообщение от 1450 Посмотреть сообщение
По моему представлению переменная Win должна по мере бОльшего и бОльшего кол-ва запусков стремиться к 0.
Нет, она должна стремиться к этому
Код:
Win:=strtoint(Label1.Caption);
то есть, к начальному значению , обозначимwin нач
Конечное значение:
win кон = win нач + x1 + x2 + ... x10000, где
x1,x2, ... - независимые дискретные случайные выличины, принимающие начения -1 или +1 с вероятностями 0,5
У каждого из низ мат.ожидание M(x1)=M(x2)=..=0
дисперсии D(x1)=D(x2)=..=1
По свойствам M и D , для суммы
M(x1 + x2 + ... x10000)= M(x1)+M(x2)+.. = 0
для дисперсии, для независимых
D(x1 + x2 + ... x10000)= D(x1)+D(x2)+.. = 10000
То есть мат.ожидание win кон : M(win кон )= win нач +0=
= win нач
Дисперсия D(win кон )= 0 + 10000 = 10000

Среднеквадратичное отклонение (сигма)= корень из D = 100

По правилу " трех сигм " ожидаемое значение win кон вероятнее всего будет болтаться вокруг M(win кон ) плюс-минус 3 сигмы.
То есть в интервале (win нач-300;win нач+300) - где-то так. Это при SpinsCount=10000. При увеличении SpinsCount интервал будет расти. Так что все правильно.

Если в самом деле Random хорошо работает. Он вроде ниче-так ...

PS А зачем Randomize внутри цикла. Можно и вне.

Последний раз редактировалось type_Oleg; 05.02.2014 в 21:40.
type_Oleg вне форума Ответить с цитированием
Старый 06.02.2014, 17:21   #7
1450
 
Регистрация: 29.02.2012
Сообщений: 3
По умолчанию

Цитата:
Сообщение от doktor255 Посмотреть сообщение
1) Что такое ГСЧ? Просьба использовать общепринятый Русский язык без сокращения слов при формировании вопросов/ответов.
2) Задача какая? При формировании ответа смотрим первый пункт.
3) Ну и так, чисто для себя. А что значит UPD?
1. ГСЧ как было замечено - Генератор Случайных Чисел. Вроде известный термин.
2. Задача - один ГСЧ загадывает 0 либо 1, второй пытается угадать. Цель - изучить динамику изменения соотношения угадал\не угадал.
3. UPD значит что я в исходное сообщение методом редактирования добавил новую информацию, которую пытаюсь выделить на фоне исходного сообщения.

Цитата:
Сообщение от raxp
И да, ваш ГСЧ не ГСЧ, а псевдо ГСЧ, причем хреновый. Хотите реальный ГСЧ - используйте шумящие биты АЦП аудиокарты, к примеру.
Цитата:
Сообщение от Arigato
В-третьих, у вас не ГСЧ, а ГПСЧ. И этим все объясняется.
Я считал, что функция Randomize НЕ является ГПЧС.
Некий абсолютный ГСЧ мне в общем-то не нужен, лишь нормальное его подобие. Извиняюсь, слаб в теории; Мне достаточно, если я смогу, скажем, 1000 раз сгенерировать массив из 1000 случайных чисел, чтобы ни один из них не совпадал. Ф-ия Randomize этого не дает?

Цитата:
Сообщение от Arigato
Во-первых, вы ошиблись на счет стремления переменной к нулю. У вас 50 на 50 +1 или -1.
При моих вычислениях +\- 1 не играет роли, а так да, справедливо!

type_Oleg
За теорию спасибо, из дома прочитаю! Не углублялся еще, решил с простого начать
1450 вне форума Ответить с цитированием
Старый 06.02.2014, 19:20   #8
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Randomize удали из цикла. Перед for его поставь.
Я попробовал, в этом случае нормально - число прыгает около 0 , то + , то -

Последний раз редактировалось type_Oleg; 06.02.2014 в 19:24.
type_Oleg вне форума Ответить с цитированием
Старый 06.02.2014, 19:25   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Ф-ия Randomize этого не дает?
Randomize это "ВЫБОР начальной точки" в бесконечной последовательности.
Постоянное (она у вас в цикле) ее использование приводит к постоянному выбору (почти) одной точки старта. Отсюда и неверные результаты.
Цитата:
Во-вторых, вынесите Randomize из цикла.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 06.02.2014, 19:38   #10
1450
 
Регистрация: 29.02.2012
Сообщений: 3
По умолчанию

Помогло, большое спасибо, тему можно закрывать!
1450 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ГСЧ k3fir4ik Общие вопросы C/C++ 1 04.10.2012 16:14
Предугадать ГСЧ Леон- Помощь студентам 1 07.04.2011 21:01
ГСЧ на C++ Memfis_nya Помощь студентам 0 15.09.2010 17:22
ГСЧ на основе шума. RomanIgorevi4 Общие вопросы C/C++ 0 04.06.2009 22:16