2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Помогите объяснить сей факт
Сообщение15.07.2014, 20:11 


07/01/13
7
При нажатии на кнопку выполняется эта процедура. В ней проверяется сколько игр выиграет игрок А играя с игроком Б с помощью рейтинга ЭЛО. На моей машине в 10 000 игр выигрывает игрок А

b win 430 1085,21923828125
a win 9571 1816,78234863281
b win 216 953,702209472656
a win 9785 1948,30261230469
b win 860 1079,17883300781
a win 9141 1822,82055664063
b win 355 983,212280273438
a win 9646 1918,7890625
b win 286 936,729797363281
a win 9715 1965,2705078125
b win 370 950,199951171875
a win 9631 1951,7978515625

Почему так часто выигрывает А?

Цитата:
{
int cc,i,j,k,bw,aw;
float ea,eb,a,b ;


bw=aw=0; //kolichestvo viigrannih igr
a=1313; //Reyting ELo igroka A
b=1589;//Reyting ELo igroka B
cc=10000;
for(i=0;i<=cc;i++){
ea = cc/(1+pow(10,(b-a)/400)); //17 igr iz 100 Eta formula ELO na wiki est'
eb = cc/(1+pow(10,(a-b)/400)); //83 igri iz 100

Randomize();
k = rand() % cc;

if (k>ea){ //b win
b=b+15*(1-(eb/cc));
a=a+15*(0-(ea/cc));

bw++;
} else{ //a win
a=a+15*(1-(ea/cc));
b=b+15*(0-(eb/cc));

aw++;
}
}
Memo1->Lines->Add("b win "+IntToStr(bw)+" "+FloatToStr(b));
Memo1->Lines->Add("a win "+IntToStr(aw)+" "+FloatToStr(a));
}

 Профиль  
                  
 
 Re: Помогите объяснить сей факт
Сообщение15.07.2014, 22:22 
Заслуженный участник


09/05/12
25179
Очевидно, потому, что где-то в программе ошибка. Поскольку комментариями она не снабжена, то найти разницу между имеющимся кодом и неведомым идеалом нереально.

 Профиль  
                  
 
 Re: Помогите объяснить сей факт
Сообщение15.07.2014, 22:41 
Заслуженный участник


02/08/11
7003
Pphantom в сообщении #887766 писал(а):
Поскольку комментариями она не снабжена
Само по себе это не обязательно плохо. Но в сочетании с названиями переменных и общим стилем не предполагающим чтение кода человеком...

-- 15.07.2014, 23:58 --

Кстати, цикл неправильный.
Вместо
for(i = 0; i <= cc; i++) {
должно быть
for(i = 0; i < cc; i++) {

-- 16.07.2014, 00:06 --

Кстати, я попробовал приведённый код. У меня b, как это и должно быть, выигрывает чаще чем a. Единственная существенная разница - у меня нет вызова загадочной функции Randomize().

-- 16.07.2014, 00:10 --

Но иногда a почему-то выигрывает больше, что странно. Всё-таки 10000 испытаний.

-- 16.07.2014, 00:12 --

Хотя понятно почему. Если a повезло несколько раз, его рейтинг становится больше и он выигрывает и дальше.

 Профиль  
                  
 
 Re: Помогите объяснить сей факт
Сообщение16.07.2014, 09:07 


07/01/13
7
Все дело в rand() - по разному работает в линуксе и винде и вообще не надежен...Тему можно закрыть

 Профиль  
                  
 
 Re: Помогите объяснить сей факт
Сообщение21.07.2014, 20:51 


29/11/10
107
letsgo! в сообщении #887810 писал(а):
Все дело в rand() - по разному работает в линуксе и винде и вообще не надежен...Тему можно закрыть

Дело не в rand(). Функция работает одинаково на любых платформах. Если не вызывать srand(/* there is any value */), то сам по себе rand не имеет смысла. Если Вы используете линукс, то эта информация есть в manpages.
Цитата:
The srand() function sets its argument as the seed for a new sequence of pseudo-random integers to be returned by rand(). These sequences are repeatable by calling srand() with the same seed value.

 Профиль  
                  
 
 Re: Помогите объяснить сей факт
Сообщение22.07.2014, 21:06 
Заслуженный участник


27/04/09
28128
letsgo! в сообщении #887810 писал(а):
и вообще не надежен...
…для криптографии. А так, вроде, вполне надёжен.

 Профиль  
                  
 
 Re: Помогите объяснить сей факт
Сообщение23.07.2014, 00:46 


27/05/14
48
А вы пробовали поменять местами
Код:
a=1313; //Reyting ELo igroka A
b=1589; //Reyting ELo igroka B


те написать:

Код:
b=1313; //Reyting ELo igroka A
a=1589; //Reyting ELo igroka B

 Профиль  
                  
 
 Re: Помогите объяснить сей факт
Сообщение27.07.2014, 00:47 


07/01/13
7
Я все перепробовал. Выкачал спец библиотеку под Cygwin - GNU Scientific Library. Там классные алгоритмы для random. С ней все работает как надо!

 Профиль  
                  
 
 Re: Помогите объяснить сей факт
Сообщение27.07.2014, 18:35 
Заслуженный участник
Аватара пользователя


01/08/06
3131
Уфа
С "загадочной функцией" Randomize() проблемы, а не с rand(). В билдере Randomize() эквивалентно srand(системный таймер), а системный таймер меняет своё значение раз в 55 миллисекунд. За это время даже на старых компьютерах можно запросто прогнать цикл 10000 раз, и в течение всего цикла rand() будет возвращать одно и то же значение. Вынесите Randomize() наружу цикла (обычно она вызывается при старте программы), и всё будет пучком.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group