1

Asp.net 2.0 (VB) で典型的な Housie/Bingo Game チケットを作成しようとしています。しかし、成功していません。チケットには 3 行と 9 列が含まれます。合計 27 個のブロックで、15 個のみが 27 個のブロックを埋める必要があります。各列には、1 番目の列は 1 ~ 10 の間で、2 番目の列は 11 ~ 20 の間のランダムな値を持つ必要があるなどの値が含まれています。各列にブロックが埋められています。乱数で..

ここにいるのは、典型的なハウジー チケットの仕様でした..このようなチケットを生成するのを手伝ってください。試してみましたが、あまり成功していません。列全体が空白になり、列の検証に..システムに余分な負荷がかかります。それを作る方法を私に見つけてください。

4

3 に答える 3

5

決定論的アルゴリズムが必要です

最初に要件を再定義します。

  1. すべての列には少なくとも 1 つの数字が必要であるため、列を完全に空白にすることはできません。
  2. 最初の列には 1..10、2 番目の 11..20、3 番目の 21..30 のように、81..90 の 9 番目の列までの数字が必要です。
  3. チケットを埋めるのに必要な数字は 15 だけです
  4. 追加要件: すべての行に 5 つの数字が必要です

これは私がそれを行う方法です:

  1. 最初に 9 つのランダムを選択します (最初の要件を満たすため)。
    • 1..10 - この範囲からの 1 つの乱数
    • 11..20 - この範囲からの 1 つの乱数
    • ...
    • 81..90 - この範囲の 1 つの乱数
  2. selectNums1..90 の数字の配列 ( ) を準備し、ステップ 1 で選択したすべてを削除します
  3. ループ
    1. selectNums配列から乱数を取得する
    2. それをチケットに追加し、配列から削除しselectNumsます
    3. 選択した数値が 3 つの列を埋める場合、その範囲のすべての数値をselectNums配列から削除します。
    4. ループのステップ 1 に戻る

このアルゴリズムは、ループ内で正確に 9 ステップ + 6 ステップを実行するため、どちらがプロセッサの使用率に適しているかが決定論的です。また、チケットには列ごとに最大 3 つの数字が入力され、1 つ以上の数字が入力されます (質問の英語が貧弱であるために要件を理解した場合)。

乱数を選択するときは、常に0からselectNums配列の長さの間の数値を選択します。これにより、数値を取得する必要がある配列内の位置が得られます。

実際のチケットを作成するための追加機能

上記の手順により、同じ 10 個の数字の範囲から最大 3 個までの正確に 15 個の数字を取得できるようになります。罰金。あとはチケットを作成するだけです。

  1. 3 つの変数を定義します: row1Countrow2Countおよびrow3Countそれらすべてを 0 に設定します。
  2. 完全に入力された列 (3 つの数字すべて) から開始して、チケットを入力します。
    1. 最初の完全な列を取得し、3 つの変数すべてを 1 ずつインクリメントしながら、チケットに入力します。
    2. selectNumsこれらの数値を配列から削除します。
    3. ステップ 2.1 に戻ります。
  3. チケットに 2 つの数字の列を入力します。
    1. 最初の 2 つの数値列を取得します。それらを埋める 3 つの可能な順列 (1&2、2&3、1&3) を使用して、チケットにそれらを埋めます。最初の順列を使用して最初のペアを埋め、2 番目の順列を 2 番目の順列で埋めます。対応する行カウンター変数をインクリメントすることを忘れないでください。
    2. selectNumsこれらの 2 つの数値を配列から削除する
    3. ステップ 3.1 に戻ります。
  4. チケットに単一の数値列 (数値が 1 つしかない列) を入力します。
    1. 配列から最初の数字を取得し、selectNumsカウントが最小の行に入れ、その特定の行のチケットに入れます。同じ数の行が 2 つ以上ある場合は、ランダムに 1 つを選択するか、最初の行 (最も速い) を取得するかのどちらかを選択できます。
    2. selectNums配列から番号を削除します
    3. 4.1に戻ります。

この部分では、すべての列に少なくとも 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; }

    ...
}

または似たようなもの。これは、このプログラム全体がオブジェクト指向の方法で改善されるという単なる考えです。

于 2010-08-09T11:56:01.340 に答える
-1
$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],
                                ]);

}
于 2016-02-19T07:51:36.883 に答える