Главная Online 1570 Login
Здравствуйте, гость Правила · Помощь

  Все темы  |  Тема закрыта  |  Новая тема  |  Новый опрос  
»  Наконец-то у нас новый генератор раздач! Подписаться | Сообщить другу | Версия для печати
      » 27/05/2001, 19:00,  ALEZI 
Сашун, Дата: 24 Мая 2001 15:18

******
А вот для пользы дела (успокоения параноиков) генератор префный было бы неплохо тут тиснуть. Без там адреса базы и прочих "секретов".
Все его там строк 30. Посмотрели б его "со стороны".


yurets (---.krasu.ru) Дата: 24 Мая 2001 16:12

ну держите :) РНР отличается немного от С, но любой программист при желании разберется

сначала сам датчик случайных чисел (ничего я тут не придумывал, все по науке, алгоритм Мерсенна), генерится случайное число из 32 бит

define("N", 624);
define("M", 397);
define("MATRIX_A", -1727483681); /* constant vector a */
define("UPPER_MASK", -2147483648); /* most significant w-r bits */
define("LOWER_MASK", 2147483647); /* least significant r bits */
$mti = N+1;
$mag01 = array(0, MATRIX_A);

function mt_regen() {
GLOBAL $mt, $mti, $mag01;
for ($kk=0; $kk $y = ($mt[$kk]&UPPER_MASK)|($mt[$kk+1]&LOWER_MASK);
$mt[$kk] = $mt[$kk+M] ^ (($y >> 1)&LOWER_MASK) ^ $mag01[$y & 1];
}
for (; $kk $y = ($mt[$kk]&UPPER_MASK)|($mt[$kk+1]&LOWER_MASK);
$mt[$kk] = $mt[$kk+(M-N)] ^ (($y >> 1)&LOWER_MASK) ^ $mag01[$y & 1];
}
$y = ($mt[N-1]&UPPER_MASK)|($mt[0]&LOWER_MASK);
$mt[N-1] = $mt[M-1] ^ (($y >> 1)&LOWER_MASK) ^ $mag01[$y & 1];
$mti = 0;
return;
}

function genrand() {
GLOBAL $mt, $mti;
if ($mti > N) exit();
if ($mti == N) mt_regen();
$y = $mt[$mti++];
$y ^= ($y >> 11) & 2097151;
$y ^= ($y << 7) & -1658038656;
$y ^= ($y << 15) & -272236544;
$y ^= ($y >> 18) & 16383;
return $y;
}

собственно сдача карт - ничего хитрого, обычное выдергивание карт из колоды. еще раз повторю, все проблемы - в датчике, а не в процедуре deal

function my_mt_rand($min = 0, $max = 51) {
return $min + abs(genrand() % ($max-$min+1));
} -- если быть очень строгим, то в этой процедуре возникает небольшая неравномерность, за счет того что 2**31 (не 32 потому что отбрасывается знак) не делится нацело на 52 ( и 32 тоже), но это несущественно.

function deal($cards)
{
unset($card);
for ($i = 0; $i < $cards; $i++) $card[$i] = $i;
for ($i = $cards; --$i;) {
$pos = my_mt_rand(0, $i);
$t = $card[$pos];
$card[$pos] = $card[$i];
$card[$i] = $t;
}
return $card;
}



yurets (---.krasu.ru) Дата: 24 Мая 2001 16:17

в первой процедуре обрезались строки for... - там в условии стояло "меньше", как тэк пошло :)

function mt_regen() {
GLOBAL $mt, $mti, $mag01;
for ($kk=0; $kk < N-M; $kk++) {
$y = ($mt[$kk]&UPPER_MASK)|($mt[$kk+1]&LOWER_MASK);
$mt[$kk] = $mt[$kk+M] ^ (($y >> 1)&LOWER_MASK) ^ $mag01[$y & 1];
}
for (; $kk < N-1; $kk++) {
$y = ($mt[$kk]&UPPER_MASK)|($mt[$kk+1]&LOWER_MASK);
$mt[$kk] = $mt[$kk+(M-N)] ^ (($y >> 1)&LOWER_MASK) ^ $mag01[$y & 1];
}
$y = ($mt[N-1]&UPPER_MASK)|($mt[0]&LOWER_MASK);
$mt[N-1] = $mt[M-1] ^ (($y >> 1)&LOWER_MASK) ^ $mag01[$y & 1];
$mti = 0;
return;
}


=====================
Ребяты! Переведите ето, плз, на русский язык! Хоть узнаем что-нибудь про "честность" етого генератора"
      » 27/05/2001, 20:56,  yurets 
ну е мое, никак народ не успокоить :)

генератор как генератор, отличие от других - использует крутейший датчик случайных чисел (2/3 кода это он и есть), а так же сохраняет состояние этого генератора в базе, что позволяет обходиться без инициализации генератора при каждом запуске (это тоже беда всех генераторов, мало того что начинают косить, так еще и время от времени расклады повторяются)

раздает проще простого - вытягивая из колоды случайные карты.
для преферанса я проверял для него только тузов в прикупе, 25 на 100 сдач в среднем и сдает. для бриджа тестировался довольно основательно, все как и должно быть.

хотя знаю, Сашун все равно скажет что надо переделать :)
      » 27/05/2001, 21:42,  ALEZI 
Дык именно ДЛЯ НАРОДОУСПОКОЕНИЯ и прошу написать, плз, построчный комментарий!
Дабы убедить народ АЛГОРИТМОМ в ПОЛНОЙ случайности выбора конкретного расклада из ПОЛНОГО их (раскладов) набора.
А тут несколько етот процесс затруднился. Нету алгоритма, но есть зато из него следствие - код вверху.

Которые тут програмисты! Сделайте читателям послабление! Напишите етот комментарий!

А дальше я возьмусь ))

Сашун, в гостях у Алези...
      » 27/05/2001, 23:09,  yurets 
насчет случайности:
первые 2 функции есть реализация генератора Мерсенна, я уже упоминал это. если интересуют подробности - могу дать ссылку. математически доказано, что этот генератор выдает равномернораспределенные значения в диапазоне -2**31..2**31-1, периодичность - 2**19937-1, т.е. существенно больше чем число вариантов раздачи карт в префе, бридже и даже тароке (там кажется 70 карт, есть такая замечательная игра).
то что генератор написан правильно - я сравнивал его работу с образцовыми реализациями (на С), все сходится.

далее, число из диапазона -2**31..2**31-1 переводится в диапазон 0..N-1, где N - число оставшихся на текущий момент карт в колоде. в этом переводе вероятность меньших значений несколько выше (где-то на 0.000001%), чем больших, но этим я пренебрег. можно добиться и идеальной равномерности, но особого смысла в этом я не вижу, отклонение не существенное.

ну и последняя функция сначала раздает все карты подряд (7п8п...КчТч), далее случайным образом выдергивает карты из еще несданной части колоды и помещает их в сданную часть этой колоды, повторяя это столько раз сколько нужно (31 для преферанса и 51 для бриджа). когда в несданной части осталась одна карта - сдача сдана.

надеюсь достаточно подробно, даже для Сашуна? ;)))
а насчет использования для сдачи карт предыдущих расладов - смысла в этом нет абсолютно никакого, разве что экономится время на 1 цикл для сдачи карт по порядку :) хотя хуже от этого тоже не станет...
      » 28/05/2001, 01:27,  Керя 
Юра, а как вы добились того, что он так много разных чисел генерировать умеет ?
      » 28/05/2001, 09:21,  Memo 
Я не знаю PHP, но с C немного знаком :-))

Настораживают строчки:

....
$mti = N+1;
....
function genrand() {
GLOBAL $mt, $mti;
if ($mti > N) exit();
....

Похоже, всегда будет срабатывать exit?!
      » 28/05/2001, 10:05,  yurets 
Кере: повторю персонально :), этого добился не я а Мерсенн. с доказательством его равномерности и периодичности (а оно существует) я разбираться не пробовал, но алгоритм довольно известный, думаю можно доверять этим цифрам.

Memo: ($mti > N) - признак того, что генератор не инициализирован, в этом случае и срабатывает exit().
а инициализация производится в процедуре mt_regen(), в коротой устанавливается $mti=0 и которая вызывается после загрузки состояния генератора из БД. процедуры работы с БД я выкладывать не стал, но уж поверьте что они работают нормально :)
      » 28/05/2001, 12:13,  Керя 
Батенька, я ж у Вас не спрашиваю "кто ?", а спрашиваю "как ?". Мне же интересно все-таки. А если Вам трудно в доказательстве разобраться, то хотя бы ссылочку дайте, я попробую прочесть.
      » 28/05/2001, 14:22,  yurets 
Батенька, вопросы формулировать четче надо

http://www.math.keio.ac.jp/~matumoto/emt.html
      » 28/05/2001, 23:12,  yurets 
Насчет математической доказанности строгой равномерности я похоже ошибся,
строго доказана периодичность генератора.
Как написано здесь, пока не дано определение "хорошей псевдослучайности", и следовательно заявлять о строгой равномерности этого генератора нельзя. Впрочем, как и любого другого генератора. Можно лишь говорить о пригодности генератора для конкретных задач, что определяется прохождением набора соответствующих тестов.

А какие тесты нужны для генератора раскладов я знаю - это тестирование кучи раскладов. Результаты тестирования генератора на 1млн бриджевых сдач можно найти на бриджевой страничке.

PS. Жалуются тут :), что на одном из столов сдали 3 мизера подряд. И что? могло быть и 4, и 5. Другое дело, что такие вещи не должны случаться слишком часто. К тому же сдачи с мизерами были сданы генератором не подряд для этого стола, а поочередно расдавались по всему префзалу (точнее по 2м залам), и из последовательности раздаваемых сдач на один стол случайно выбрались 3 сдачи с мизерами. Проблемы в этом не вижу.
Сашун вон как-то 7 мизеров в одной пуле сыграл - так выходит у него ручной генератор закосил? :))

В общем, особо обеспокоенной общественности рекомендую попробовать собрать статистику по сдачам хотя бы за неделю, а лучше за месяц, а остальным - успокоиться и тратить свои силы на игру, а не на ... :)
Я кстати за потраченное на подобные сообщения время тоже мог бы сделать чего путнего для Гэмблера, так нет же :)
      » 28/05/2001, 23:30,  Kirk 
ну, это мизеров в той пуле у Сашуна 7 штук было... а взяток - аж 11 ;-))
      » 29/05/2001, 08:54,  yurets 
ну тогда все в норме, в среднем 1,57 взятки на мизер :))
а вот если бы все мизера были неловленые, тогда - руки сдающим отрывать :)))
      » 29/05/2001, 16:38,  Kirk 
Сдающие там были Юрасик, Алези и Трудный...
ЭТИ чистых не сдают ;-))
      » 31/12/2003, 20:31,  клонец 
yurets
Дата: 27 Мая 2001 20:09

насчет случайности:
первые 2 функции есть реализация генератора Мерсенна, я уже упоминал это. если интересуют подробности - могу дать ссылку. математически доказано, что этот генератор выдает равномернораспределенные значения в диапазоне -2**31..2**31-1, периодичность - 2**19937-1, т.е. существенно больше чем число вариантов раздачи карт в префе, бридже и даже тароке (там кажется 70 карт, есть такая замечательная игра).
то что генератор написан правильно - я сравнивал его работу с образцовыми реализациями (на С), все сходится.

далее, число из диапазона -2**31..2**31-1 переводится в диапазон 0..N-1, где N - число оставшихся на текущий момент карт в колоде. в этом переводе вероятность меньших значений несколько выше (где-то на 0.000001%), чем больших, но этим я пренебрег. можно добиться и идеальной равномерности, но особого смысла в этом я не вижу, отклонение не существенное.

ну и последняя функция сначала раздает все карты подряд (7п8п...КчТч), далее случайным образом выдергивает карты из еще несданной части колоды и помещает их в сданную часть этой колоды, повторяя это столько раз сколько нужно (31 для преферанса и 51 для бриджа). когда в несданной части осталась одна карта - сдача сдана.

надеюсь достаточно подробно, даже для Сашуна? ;)))
а насчет использования для сдачи карт предыдущих расладов - смысла в этом нет абсолютно никакого, разве что экономится время на 1 цикл для сдачи карт по порядку :) хотя хуже от этого тоже не станет...
===================================
В отличие от того же Юрца, я заранее не знаю- буду ли хвалить или критиковать автора. Это зависит от того как он сумеет объяснить свои идеи.( Оригинал я какой!)
Так вот из вышеприведенного не все понятно. Грубо говоря есть прямые логические противоречия в тексте.
Почитайте внимательно, может чего исправить надо?
      » 1/02/2010, 17:56,  knyaz32 
читал невнимательно, но играю в преферанс давно, и не понимаю, почему за 1 день( за 7 игр) получил 15!!! раскладов 4 на 4....
      » 2/02/2010, 00:59,  Colobus 
Смешно... Не забивайте себе голову. Один не правильно формулирует вопрос, а другой правильно отвечает на неправильно сформулированный вопрос. И понимают они друг друга, как карокалпак и тунгус. Смешно...

--------------------
Самомнение пораждает глупость!

Силу удара в лоб определяет тон дающего ответ (с)



Честь имею, Colobus.
      » 2/02/2010, 01:22,  Сашун 
knyaz32 ( "1/".$m["фев"]."/2010," 18:56)
...играю в преферанс давно, и не понимаю, почему за 1 день (за 7 игр) получил 15!!! раскладов 4 на 4....

Потому, что 7 пуль - ето примерно 160 сдач. Вероятность "попасть в 4 одной мастью", как известно, составляет 9%.
160*0,09 = 14,4. Фактически случилось 15. Так и мастей в колоде больше одной ))).

Насчет распределения мастей по рукам игроков можно почитать тут - http://www.gambler.ru/forum/index.php?showtopic=131914 .

--------------------
С уважением, А.Малышев
      » 2/02/2010, 01:27,  Colobus 
Еще один правильный ответ на неправильный вопрос. Смешно.

--------------------
Самомнение пораждает глупость!

Силу удара в лоб определяет тон дающего ответ (с)



Честь имею, Colobus.
      » 3/02/2010, 20:04,  BASSs 
Сашун ( "1/".$m["фев"]."/2010," 18:22)
knyaz32 ( "1/".$m["фев"]."/2010," 18:56)
...играю в преферанс давно, и не понимаю, почему за 1 день (за 7 игр) получил 15!!! раскладов 4 на 4....

Потому, что 7 пуль - ето примерно 160 сдач. Вероятность "попасть в 4 одной мастью", как известно, составляет 9%.
160*0,09 = 14,4. Фактически случилось 15. Так и мастей в колоде больше одной ))).

Насчет распределения мастей по рукам игроков можно почитать тут - http://www.gambler.ru/forum/index.php?showtopic=131914 .

А скажите, Александ Алексеевич, вот та вероятность в 9% получения стенки -- ето от обшего кол-ва сдач или же все таки в тех только сдачах, когда у одного в руке уже есть 4 карты 1-й масти? Другими словами я получу стену (а соответственно 2 игрока получат по 4 карты 1-и масти) в 9% ВСЕХ раздач? Или же всё-таки, если у меня в руках 4 карты 1-й масти, тогда в 9% случаев на другой руке будет тоже 4 карты етой же масти? Надеюсь, я правильно задал вопрос?
      » 3/02/2010, 21:53,  Colobus 
Правильно. А это имеет какое-нибудь значение? 9 процентов или 39 процентов. Есть разница?

--------------------
Самомнение пораждает глупость!

Силу удара в лоб определяет тон дающего ответ (с)



Честь имею, Colobus.
      » 3/02/2010, 23:18,  Сашун 
BASSs ( "3/".$m["фев"]."/2010," 21:04)
А скажите, Александ Алексеевич, вот та вероятность в 9% получения стенки -- ето от обшего кол-ва сдач или же все таки в тех только сдачах, когда у одного в руке уже есть 4 карты 1-й масти? ... Надеюсь, я правильно задал вопрос?

Вопрос, главное, понятен!

Берем колоду, тасуем, и сдаем на 3 руки все 32 карты.
И, с удивлением, видим, что на одной из рук таки есть 4-карточная масть ))).
Понятно, что не всегда. Но, есть!

Домашнее задание.
Преферансная колода (32 карты) сдана на 3 руки: 10, 10 и 12. Вычислить вероятность события "Нет руки с 4-карточной мастью".

--------------------
С уважением, А.Малышев
      » 4/02/2010, 00:59,  Фактор 
Сашун ( "2/".$m["фев"]."/2010," 01:22)
knyaz32 ( "1/".$m["фев"]."/2010," 18:56)
...играю в преферанс давно, и не понимаю, почему за 1 день (за 7 игр) получил 15!!! раскладов 4 на 4....

Потому, что 7 пуль - ето примерно 160 сдач. Вероятность "попасть в 4 одной мастью", как известно, составляет 9%.
160*0,09 = 14,4. Фактически случилось 15. Так и мастей в колоде больше одной ))).

Насчет распределения мастей по рукам игроков можно почитать тут - http://www.gambler.ru/forum/index.php?showtopic=131914 .

Фсё посчитал чел тока все 15 стенок в ОДНУ харю это до хрена!
      » 4/02/2010, 01:17,  Сашун 
http://www.gambler.ru/php/stat.php?game=9

--------------------
С уважением, А.Малышев
      » 4/02/2010, 01:22,  Фактор 
Сашун ( "4/".$m["фев"]."/2010," 01:17)
http://www.gambler.ru/php/stat.php?game=9

Я тут читал - там не все стенки. Местный сдатчик любит выдавать из прикупа на стенку.
      » 4/02/2010, 11:21,  ЙцукеМен 
А это уже интересней... Т.е. в статистике гамблера учитывается только то, что изначально роздано на руки?
      » 4/02/2010, 12:45,  ustin 
А как надо считать? Вот был расклад 4-2-0-(2). Будет стенка или нет зависит от того, кто купит. Допустим , что купил к 2 и снес их же. Это стенка или нет?
      » 4/02/2010, 14:09,  ЙцукеМен 
Думаю, что игрока наилучшим образом устроила бы статистика стенок после взятия прикупа и до сноса. Стало быть купил к 2-м - эта масть легла 4-0 - значит стенка. А уж что я снесу - это дело случая/везения.
      » 4/02/2010, 23:42,  Colobus 
Вот что интересно. Задается вопрос - ответ из школьного курса математики. Опять задается вопрос - ответ элементарная статистика. И так раз за разом. Сказка про белого бычка. Так может вопрос неправильно сформулирован.

--------------------
Самомнение пораждает глупость!

Силу удара в лоб определяет тон дающего ответ (с)



Честь имею, Colobus.
      » 11/02/2010, 17:12,  Вертун 
Colobus ( "4/".$m["фев"]."/2010," 23:42)
Вот что интересно. Задается вопрос - ответ из школьного курса математики. Опять задается вопрос - ответ элементарная статистика. И так раз за разом. Сказка про белого бычка. Так может вопрос неправильно сформулирован.

Возможно не все в школе учили математику и уж точно не у всех в ВУЗах была матстатистика (в технических, наскока я помню, есть тока краткий курс типа "Теория вероятностей"wink.gif. И еще вопрос кто чего помнит :-))

Соответственно и вопросы отсюда.
      » 23/09/2010, 12:54,  Т_а_п_о_к 
хм... к вопросу о стенках...
я думаю никого не будет волновать, есть ли стенка в СТОРОННИХ мастях, а играющего будет прежде всего интересовать будет ли стенка в КОЗЫРНОЙ масти либо же в масти в которой играющий планирует взять пару взяток (т.е. в которой у него есть какая-то сила)
т.е. необходимо вычислить вероятности не просто 4/4 а таких (к примеру) раскладов: туз, король, валет, фоска / остальные; туз, дама, валет, фоска / остальные .... ну вы меня понялиsmile.gif)
а вот вероятность подобных раскладов намного ниже ваших 9%smile.gif
ЗЫ: мы играем в преферанс а не в какую-то математическую модель где НЕВАЖНО какие картинки мы перекладываем и переставляем...

Это сообщение отредактировал Т_а_п_о_к - 23/09/2010, 12:58
  Все темы  |  Тема закрыта  |  Новая тема  |  Новый опрос  
« Предыдущая тема | Перечень тем | Следующая тема »
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей: