Расшифровка RayW Poker Hand Evaluator

Я пытаюсь расшифровать этот код: https://github.com/tangentforks/TwoPlusTwoHandEvaluator/blob/master/generate_table.cpp

Код используется для создания массивной таблицы поиска, которая затем используется для поиска рангов рук из 7 карт. Мне трудно понять, почему основной метод написан именно так. Насколько я могу судить об этом, первый цикл for перебирает каждую отдельную комбинацию карт, заменяя соответствующие абстракции мастей, когда это необходимо, но я не уверен, почему это повторяется в следующем разделе или почему оно масштабируется с коэффициентом 53, а затем добавил 53 к. Может ли кто-нибудь пролить свет на это?

Это код, о котором идет речь::

  printf("\nGetting Card IDs!\n");

  // Jmd: Okay, this loop is going to fill up the IDs[] array which has
  // 612,967 slots. as this loops through and find new combinations it
  // adds them to the end. I need this list to be stable when I set the
  // handranks (next set)  (I do the insertion sort on new IDs these)
  // so I had to get the IDs first and then set the handranks
  for (IDnum = 0; IDs[IDnum] || IDnum == 0; IDnum++) {
    // start at 1 so I have a zero catching entry (just in case)
    for (card = 1; card < 53; card++) {
      // the ids above contain cards upto the current card.  Now add a new card
      ID = MakeID(IDs[IDnum], card);   // get the new ID for it
      // and save it in the list if I am not on the 7th card
      if (numcards < 7) holdid = SaveID(ID);
    }
    printf("\rID - %d", IDnum);   // show progress -- this counts up to 612976
  }

// main()
  printf("\nSetting HandRanks!\n");

  // this is as above, but will not add anything to the ID list, so it is stable
  for (IDnum = 0; IDs[IDnum] || IDnum == 0; IDnum++) {
    // start at 1 so I have a zero catching entry (just in case)
    for (card = 1; card < 53; card++) {
      ID = MakeID(IDs[IDnum], card);

      if (numcards < 7) {
    // when in the index mode (< 7 cards) get the id to save
    IDslot = SaveID(ID) * 53 + 53;
      } else {
    // if I am at the 7th card, get the equivalence class ("hand rank") to save
    IDslot = DoEval(ID);
      }

      maxHR = IDnum * 53 + card + 53;   // find where to put it
      HR[maxHR] = IDslot; // and save the pointer to the next card or the handrank
    }

    if (numcards == 6 || numcards == 7) {
      // an extra, If you want to know what the handrank when there is 5 or 6 cards
      // you can just do HR[u3] or HR[u4] from below code for Handrank of the 5 or
      // 6 card hand
      // this puts the above handrank into the array
      HR[IDnum * 53 + 53] = DoEval(IDs[IDnum]);
    }

    printf("\rID - %d", IDnum); // show the progress -- counts to 612976 again
} 

person cubesnyc    schedule 24.08.2017    source источник
comment
Ссылка состоит из 456 строк кода и имеет десятки циклов. Вы могли бы быть немного более точным в отношении того, о каком цикле вы спрашиваете.   -  person brian beuning    schedule 24.08.2017
comment
Я упомянул это в вопросе, два основных цикла for в основном методе.   -  person cubesnyc    schedule 24.08.2017
comment
При преобразовании числа с основанием 10 в строковой форме в двоичную форму код умножается на 10 для каждой цифры. Поскольку имеется 52 карты, и я предполагаю, что 1 дополнительное значение означает последнюю карту, этот код умножается на 53, чтобы упаковать несколько карт в одно целое число. Поскольку log(2^64)/log(53) = 11,22, они могут упаковать 11 карт в одно 64-битное целое число без переполнения.   -  person brian beuning    schedule 24.08.2017


Ответы (1)


Делаем то же самое в настоящее время. Он сдвинут на 53, потому что карт 52. Как только вы укажете на недопустимое состояние, вы перейдете в 0. Оттуда любая карта, которую вы выберете, все равно должна привести к недопустимому состоянию, поэтому первые 53 записи 0 + 52 ранга указывают на 0. Первая значимая запись идет на 53. .(53+53).

Постарайтесь сначала понять концепцию. Таблица представляет собой огромный ориентированный граф, в котором каждый узел имеет 52 дочерних узла и один узел «evaluate-current-handrank-node» с индексом 0. Poker-ai.org и исходный поток предоставляют много полезной информации. Также обратите внимание на идею CactusKevs по получению ранжирования карт с помощью простых чисел. Гений. Все идет к этому.

person Benj    schedule 27.10.2018