Re: update


Автор сообщения: amateur
Дата и время сообщения: 25 October 2004 at 20:42:21:

В ответ на сообщение: Re: приехали

> Это напомнило мне студента одного моего коллеги, который с жаром отстаивал
> правильность весьма революционных результатов своей программы.

Рано.

Короче Вы забыли проапдайть бесконечное колво денег казино.
потому и плавает. Плюс переполнение даже в вашем bet.
( конечно мои недоработки )

Короче, все меняю все на double и опять тренд :-)
---
4399999: casino=33054544, players=646, common=-33055190, losers=6059518 (OK)
4499999: casino=33810510, players=381, common=-33810892, losers=6196982 (OK)
4599999: casino=34569144, players=411, common=-34569555, losers=6334331 (OK)
4699999: casino=35328434, players=424, common=-35328859, losers=6472024 (OK)
4799999: casino=36084501, players=1194, common=-36085696, losers=6609317 (OK)
4899999: casino=36844545, players=430, common=-36844976, losers=6747368 (OK)
4999999: casino=37609071, players=452, common=-37609523, losers=6885261 (OK)
----
---
cофтина, попробуйте запустить.
---------------------
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#include "math.h"


#define NUM_ITERATIONS 5000000 /* общее количество опытов */
#define BIG_VALUE 1000000000 /*$ много денег, заведомо больше чем будет в игре */
#define NUM_PLAYERS 10 /* количесво игроков */
#define PLAYER_VALUE 5 /* средняя сумма $ с которой игрок приходит в казино */
#define ANALIZE_ITERATION 100000 /* количество опытов для подсчета промежуточных средних */


double casino_sum = BIG_VALUE; /* первоначальная сумма казино */
double common_players_sum = BIG_VALUE; /* общаг, первоначальная сумма всех игроков */
double players[NUM_PLAYERS]; /* игроки, промежуточные значения выигрыша(счета) */


struct /* для подсчета промежуточных средних */
{
double t_playrs;
double t_casino;
double t_players_sum;
} stat[ANALIZE_ITERATION + 1];


int main(int argc, char* argv[])
{
int i,j;
double sum;
int losers = -NUM_PLAYERS; /* счетчик проигравших */
double test; /* для проверки что деньги не потеряли */
/* промежуточные суммы */
double sum_playrs = 0, sum_casino = 0, sum_players_sum = 0;
double bet; /* текущая ставка */
double value; /* текущая загрузка нового игрока */
// int threshold = RAND_MAX * 1 / 2; /* честное казино */
// int threshold = (RAND_MAX + 1) * 18 / 37; /* обычное казино с зеро */
int threshold = (RAND_MAX+1) * 1 / 2;

srand( (unsigned)time( NULL ) ); /* зарядить генератор случайных чисел */

/* цикл по количеству опытов */
for( i = 0; i < NUM_ITERATIONS; i++ )
{
/* цикл по числу игроков */
for( j = 0; j < NUM_PLAYERS; j++ )
{
if( players[j] == 0 ) /* запустить нового игрока если место свободно */
{
/* допущение о распределении денег по игрокам - экспоненциальное
( поскольку у игроков дейсвительно много денег */
// value = ceil( test = -(PLAYER_VALUE) * log( (double)rand()/ RAND_MAX ) );

value = ceil( test = -(PLAYER_VALUE) * log( ((double)rand()+1)/ (RAND_MAX+1) ) );

players[j] = value;
common_players_sum -= value;
losers++; /* увеличить счетчик проигравших */
}

/*** gambling here ***/

/* допущение о распределении ставки - равномерное по всей сумме $, имеющейся у игрока */
bet = ceil( players[j] * (double)rand()/RAND_MAX );
// bet = 1+(players[j] * rand()) /(RAND_MAX+1);

/* игра на ставку - чет/нечет */
if( rand() < threshold )
{
casino_sum += bet; /* casino win */
players[j] -= bet; /* player lost */
}
else
{
casino_sum -= bet; /* casino lost */
players[j] += bet; /* player win */
}
}

/* подсчет текущего выигрыша игроков */
sum = 0;
for( j = 0; j < NUM_PLAYERS; j++)
{
sum += players[j];
}

/* получит индекс внутри промежкточной серии */
j = i % ANALIZE_ITERATION;

/* накапливать статистику промежуточной серии опытов */
stat[j].t_playrs = sum;
stat[j].t_casino = casino_sum;
stat[j].t_players_sum = common_players_sum;

/* если закончили промежкточную серию опытов - то подсчет средних */
if( j+1 == ANALIZE_ITERATION )
{
/* сре */
sum_playrs = 0; sum_casino = 0; sum_players_sum = 0;
for( j = 0; j < ANALIZE_ITERATION; j++)
{
sum_playrs += stat[j].t_playrs;
sum_casino += stat[j].t_casino;
sum_players_sum += stat[j].t_players_sum;
}
/* проверить что счета совпадают(двойная бухгалтерия, балланс) */
test = (int)sum_playrs + sum_casino + sum_players_sum - 2*ANALIZE_ITERATION*(double)BIG_VALUE;

sum_playrs /= ANALIZE_ITERATION;
sum_casino /= ANALIZE_ITERATION;
sum_players_sum /= ANALIZE_ITERATION;

/* печатать: номер опыта,
- средний выигрыш казино
- средний выигрыш игроков (cколько в среднем на руках у игроков) ,
- сумма взятая из общага,
- количесво проигравших и выбывших
- тестирование баланса по прромежуточной серии опытов
*/
printf("%7.7d: casino=%d, players=%d, common=%d, losers=%d (%s)\n",
i, (int)(sum_casino - BIG_VALUE), (int)sum_playrs, (int)(sum_players_sum - BIG_VALUE), losers,
test?"ERROR":"OK"
);
}

}

return 0;
}



1807. Возвращение честного шашлычника - Michael 22:41 17.10.04 (223)
К списку тем на странице