2014 dxdy logo

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

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




 
 Помогите объяснить сей факт
Сообщение15.07.2014, 20:11 
При нажатии на кнопку выполняется эта процедура. В ней проверяется сколько игр выиграет игрок А играя с игроком Б с помощью рейтинга ЭЛО. На моей машине в 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 
Очевидно, потому, что где-то в программе ошибка. Поскольку комментариями она не снабжена, то найти разницу между имеющимся кодом и неведомым идеалом нереально.

 
 
 
 Re: Помогите объяснить сей факт
Сообщение15.07.2014, 22:41 
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 
Все дело в rand() - по разному работает в линуксе и винде и вообще не надежен...Тему можно закрыть

 
 
 
 Re: Помогите объяснить сей факт
Сообщение21.07.2014, 20:51 
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 
letsgo! в сообщении #887810 писал(а):
и вообще не надежен...
…для криптографии. А так, вроде, вполне надёжен.

 
 
 
 Re: Помогите объяснить сей факт
Сообщение23.07.2014, 00:46 
А вы пробовали поменять местами
Код:
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 
Я все перепробовал. Выкачал спец библиотеку под Cygwin - GNU Scientific Library. Там классные алгоритмы для random. С ней все работает как надо!

 
 
 
 Re: Помогите объяснить сей факт
Сообщение27.07.2014, 18:35 
Аватара пользователя
С "загадочной функцией" Randomize() проблемы, а не с rand(). В билдере Randomize() эквивалентно srand(системный таймер), а системный таймер меняет своё значение раз в 55 миллисекунд. За это время даже на старых компьютерах можно запросто прогнать цикл 10000 раз, и в течение всего цикла rand() будет возвращать одно и то же значение. Вынесите Randomize() наружу цикла (обычно она вызывается при старте программы), и всё будет пучком.

 
 
 [ Сообщений: 9 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group