Сложный процесс изготовления типичного билета на игру Housie / Bingo? - PullRequest
1 голос
/ 09 августа 2010

Я пытаюсь создать типичный билет на игру Housie / Bingo в Asp.net 2.0 (VB).Но не удалось.Билет содержит 3 строки с 9 столбцами.Всего 27 блоков, и должно быть только 15, должны быть заполнены из этих 27. и каждый столбец содержит значение, как 1-й столбец должен быть между 1-10 и 2-й должен иметь случайные значения между 11-20 .. Не имеет значения, сколькоблоки, заполненные в каждом столбце. 1 - обязательный, ни один столбец не должен быть пустым, все 9 столбцов должны быть заполнены, в некоторых заполнены все 3 блока, в некоторых - 1, в общей сложности 15 блоков заполнены.со случайными числами ..

Ребята, здесь была типичная спецификация билета на хоуси .. Пожалуйста, помогите мне сгенерировать такой билет.Я пытался, но, не слишком удачно, я получаю пустой столбец и проверяю столбцы .. принимает дополнительную нагрузку на систему.пожалуйста, найдите мне способ сделать это.

Ответы [ 2 ]

4 голосов
/ 09 августа 2010

Вам нужен детерминированный алгоритм

Сначала переопределите ваши требования:

  1. В каждом столбце должно быть хотя бы 1 число, поэтому ни один столбец не должен быть полностью пустым
  2. Первый столбец должен иметь числа от 1..10, второй 11..20, третий 21..30 и т. Д. До девятого столбца с 81..90
  3. для заполнения билета нужно всего 15 номеров
  4. Дополнительное требование : в каждой строке должно быть 5 чисел

Вот как бы я это сделал:

  1. Сначала выберите 9 рандомов (чтобы удовлетворить первое требование)
    • 1..10 - одно случайное число из этого диапазона
    • 11..20 - одно случайное число из этого диапазона
    • ...
    • 81..90 - одно случайное число из этого диапазона
  2. Подготовить массив (selectNums) чисел 1..90 и удалить все выделенные на шаге 1
  3. Loop
    1. получить случайное число из массива selectNums
    2. добавьте его в свой билет и удалите из selectNums aray
    3. если выбранное число заполняет столбец из трех, то удалите все числа из этого диапазона из массива selectNums.
    4. Вернитесь к шагу 1 в цикле

Этот алгоритм будет выполнять ровно 9 шагов + 6 шагов в цикле, поэтому он является детерминированным, что лучше для использования процессора. И это также заполняет ваш билет до трех цифр в столбце и не менее 1 (если я понял ваши требования из-за слишком плохого английского в вопросе).

Yo, когда вы выбираете случайные числа, вы всегда выбираете число от 0 до selectNums длины массива, которое даст вам позицию в массиве, откуда вы должны взять число.

Дополнительные функции для создания фактического билета

Вышеуказанные шаги приведут вас к точке, в которой вы получите ровно 15 чисел с максимум 3 числами из того же диапазона из десяти чисел. Хорошо. Все, что вам нужно сделать сейчас, это создать билет.

  1. определить 3 переменные: row1Count, row2Count и row3Count и установить их все в 0.
  2. Заполните заявку, начиная с полностью заполненных столбцов (все три числа):
    1. Получить первый полный столбец и заполнить его в заявке, а также увеличить все три переменные на одну.
    2. Удалите эти числа из массива selectNums.
    3. Вернитесь к шагу 2.1.
  3. Заполните заявку столбцами с двумя числами:
    1. Получить первые два числа столбца. Заполните их в билете, используя три возможных варианта их заполнения (1 и 2, 2 и 3, 1 и 3). Заполните первую пару, используя первую перестановку, вторую со второй и так далее. Не забудьте увеличить соответствующие переменные счетчика строк.
    2. удалить эти два числа из selectNums массива
    3. Вернитесь к шагу 3.1.
  4. Заполните заявку столбцами с одним номером (те, которые имеют только один номер):
    1. Получите первое число из массива selectNums и поместите его в строку с наименьшим количеством и вставьте в билет в этой конкретной строке. Если есть хотя бы две строки с одинаковым количеством, вы можете выбрать любую, какую пожелаете, выбрав одну из них случайным образом или выбрав первую (самую быструю).
    2. Удалить номер из selectNums массива
    3. Вернитесь к 4.1.

В этой части вы получите полностью заполненный тикет, в котором все столбцы содержат хотя бы одно число, а все строки содержат ровно 5 номеров.

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

Одно последнее замечание

Это решение было упрощено за счет использования массивов и счетчиков. Конечно, вы можете создать полную объектную модель, которая будет функционально насыщенной и предоставит вам всю необходимую информацию. Например, у вас могут быть классы Ticket и TicketColumn:

public class TicketColumn
{
    public int Count { get; }
    public int? FirstRowValue { get; set; }
    public int? SecondRowValue { get; set; }
    public int? ThirdRowValue { get; set; }

    ...
    public void Reorder() { ... }
}

public class Ticket
{
    public TicketColumn[] Columns

    public int FirstRowCount { get; private set; }
    public int SecondRowCount { get; private set; }
    public int ThirdRowCount { get; private set; }

    ...
}

Или что-то подобное. Это просто идея, что вся эта программа будет лучше в объектно-ориентированной манере.

0 голосов
/ 19 февраля 2016
$arr = new SplFixedArray(27);

for($m=1;$m<=100000;$m++)
{
    in:
     $final_array  = array();
     foreach ( $arr as $key => $val )
     $final_array[ $key+1 ] = $val;

     $elements_array=array();
     foreach ( $arr as $key => $val )
     $elements_array[ $key+1 ] = $val;

    for($i=1;$i<=count($elements_array);$i++)
    {

      if($i==1 || $i==10 || $i==19 )
      {
        $elements_array[$i]=rand(1,9);
      }

      if($i==2 || $i==11 || $i==20 )
      {
        $elements_array[$i]=rand(10,19);
      }

      if($i==3 || $i==12 || $i==21 )
      {
        $elements_array[$i]=rand(20,29);
      }

      if($i==4 || $i==13 || $i==22 )
      {
        $elements_array[$i]=rand(30,39);
      }
      if($i==5 || $i==14 || $i==23 )
      {
        $elements_array[$i]=rand(40,49);
      }

      if($i==6 || $i==15 ||$i==24 )
      {
        $elements_array[$i]=rand(50,59);
      }

      if($i==7 || $i==16 ||$i==25 )
      {
        $elements_array[$i]=rand(60,69);
      }

      if($i==8 || $i==17 || $i==26 )
      {
        $elements_array[$i]=rand(70,79);
      }

      if($i==9 || $i==18 || $i==27)
      {
        $elements_array[$i]=rand(80,90);
      }
    }
    for($k=1;$k<=5;$k++)
    {
      $index1=rand(1,9);
      $final_array[$index1]=$elements_array[$index1];
    }
    $x1 = 0;
    $ar1=[];
    for($q=1;$q<=9;$q++)
    {
        if(isset($final_array[$q]))
        {
            $ar1[$x1]= $q;
            $x1++;
        }
    }
    loop:
    if($x1 != 5)
    {
        $in1 =rand(1,9);

        if(!in_array($in1, array_keys($ar1)))
        {
            $final_array[$in1]=$elements_array[$in1];
            $ar[$x1]= $in1;
            $x1++;

        }
        goto loop;
    }
    $z1=0;
    for($q=1;$q<=9;$q++)
    {
        if(isset($final_array[$q]))
        {
            $ar1[$x1]= $q;
            $z1++;
        }
    }
    if($z1 != 5)
    goto in;

    for($l=1;$l<=5;$l++)
    {
      $index2=rand(10,18);        
      $final_array[$index2]=$elements_array[$index2];

    }

    $x2 = 0;
    $ar2=[];
    for($q=10;$q<=18;$q++)
    {
        if(isset($final_array[$q]))
        {
            $ar2[$x2]= $q;
            $x2++;
        }
    }
    loop2:
    if($x2 != 5)
    {
        $in2 =rand(10,18);

        if(!in_array($in2, array_keys($ar2)))
        {
            $final_array[$in2]=$elements_array[$in2];
            $ar[$x2]= $in2;
            $x2++;

        }
        goto loop2;
    }
    $z2=0;
    for($q=10;$q<=18;$q++)
    {
        if(isset($final_array[$q]))
        {
            $ar1[$x1]= $q;
            $z2++;
        }
    }
    if($z2 != 5)
    goto in;

    for($n=1;$n<=5;$n++)
    {
      $index3=rand(19,27);

      $final_array[$index3]=$elements_array[$index3];

    }

    $x3 = 0;
    $ar3=[];
    for($q=19;$q<=27;$q++)
    {
        if(isset($final_array[$q]))
        {
            $ar3[$x3]= $q;
            $x3++;
        }
    }
    loop3:
    if($x3 != 5)
    {
        $in3 =rand(19,27);

        if(!in_array($in3, array_keys($ar3)))
        {
            $final_array[$in3]=$elements_array[$in3];
            $ar[$x3]= $in3;
            $x3++;

        }
        goto loop3;
    }
    $z3=0;
    for($q=19;$q<=27;$q++)
    {
        if(isset($final_array[$q]))
        {
            $ar3[$x3]= $q;
            $z3++;
        }
    }
    if($z3 != 5)
    goto in;

    DB::table('tambola')->insert(['a1'=>$final_array[1],
                                  'a2'=>$final_array[2],
                                  'a3'=>$final_array[3],
                                  'a4'=>$final_array[4],
                                  'a5'=>$final_array[5],
                                  'a6'=>$final_array[6],
                                  'a7'=>$final_array[7],
                                  'a8'=>$final_array[8],
                                  'a9'=>$final_array[9],
                                  'b1'=>$final_array[10],
                                  'b2'=>$final_array[11],
                                  'b3'=>$final_array[12],
                                  'b4'=>$final_array[13],
                                  'b5'=>$final_array[14],
                                  'b6'=>$final_array[15],
                                  'b7'=>$final_array[16],
                                  'b8'=>$final_array[17],
                                  'b9'=>$final_array[18],
                                  'c1'=>$final_array[19],
                                  'c2'=>$final_array[20],
                                  'c3'=>$final_array[21],
                                  'c4'=>$final_array[22],
                                  'c5'=>$final_array[23],
                                  'c6'=>$final_array[24],
                                  'c7'=>$final_array[25],
                                  'c8'=>$final_array[26],
                                  'c9'=>$final_array[27],
                                ]);

}
...