• ベストアンサー

CGI ビンゴゲームの作り方教えてください

CGIでビンゴゲーム(biglobeの「ただのビンゴ」みたいなやつ)を作りたいのですが、カードの生成方法で悩んでいます。カードの番号の並びが、だぶらないように、登録者へ配布(ページへ表示)するには、どうしたらよいでしょうか? CGIで生成したビンゴカードの数字の並びが、すでに配布済みのカードとだぶっていないかどうか、一から調べると、登録者が多い場合、処理が重くなってしまいます。 何か効率のいい方法がありましたら、教えてください。お願いします。

  • CGI
  • 回答数5
  • ありがとう数9

質問者が選んだベストアンサー

  • ベストアンサー
  • taba
  • ベストアンサー率61% (349/567)
回答No.5

この問題、一般人には厳しいですね。 考え方としては、「あらかじめカードを作成しておき、それを一枚ずつ出す」というので正解だと思います。 で、カードの重複しない作成ですが、ビンゴカードが5×5で真中がフリーの24の数字とします(本当は1行目は1~20までの数字とか決まりがあるんだと思うけど、よく知らないので無視します)。 ○99の数字から24個を抽出 ○24個をランダムに並べる(順列) という手続きだと思います。 順列を作るプログラムは参考URLを参照していただくとして、問題は組合せですね。ちょっとサンプルが発見できませんでした。 ちょっとアルゴリズムに詳しい人なら、簡単に書けるような気がするんですが、私には無理です。すみません。 なんかヒントになるといいのですが。

参考URL:
http://www2.tech-unet.ocn.ne.jp/PerlMania2nd/perlfaq4.html#HowdoIpermuteNelementsofalist?

その他の回答 (4)

noname#25358
noname#25358
回答No.4

 補足見ました。  ダブりのない完全乱数を自動的に生成するのは、コンピュータが「計算機」である以上、実質不可能です。  コンピュータに任せられないのであれば自分で作るしかありません。  ですがある程度、でよければ、ランダムシードと呼ばれる数値をこちら側で制御してあげればOKです。  ランダムシードはPerlでは、関数srandに渡す値のことです。関数srandは、関数randから返ってくるランダム値の値の順番を初期化します。  ですから、以前使用したランダムシードを二度と使わないようにすれば、同じ順序のランダムがもう一度発生することはありません。  通常は   srand(time);  で充分ですが、これで足りないのであればこちら側でランダムシードに渡す順序をファイルか何かに格納しておけばいいでしょう。  なお、それでも不安だということであれば、1つ1つ比較するしかありません(チェックサム方式でよければそれも1つの手ですが)。

noname#25358
noname#25358
回答No.3

 通常、重複のない複数の乱数を発生する場合は、次のようなルーチンを組みます。  for ( $i = 0; $i < 10; $i++ ) { retry:   $table[$i] = int(rand(100));   for ( $j = 0; $j < $i; $j++ ) {    if ( $table[$i] == $table[$j] ) {     goto retry;    }   }  }  こうすれば、配列変数@table[1..10]に重複のない0~99の数字を入れることができます。  また、CGIの場合、この数字を保存したり他の利用者と共有するにはファイルを使います。  その昔、コンピュータがまだ8ビットだった頃からこの手法を使っていましたが、これで重くなったという話は聞いたことがありません(^_^;  ですからこの方法で特に問題ないと思います。

ssshiro
質問者

お礼

ご回答ありがとうございます。 今回、質問しているのは、番号の重複というより、番号の並びの重複を避ける方法が知りたいのです。(質問がわかりづらくてすみませんでした。) 乱数を利用して、番号の並びを変えても、必ず並びが重複しない!とは言い切れませんし…。 なにか良い方法がありましたら、よろしくお願いいたします。

回答No.2

種を与えて乱数使えばよいのでは? それなら他の人とだぶらないでしょう。

ssshiro
質問者

お礼

ご回答、ありがとうございます。 乱数を利用して、番号の並びを変えても、同じ並びのカードができないとは言い切れないですし…。(やっぱり、多少のだぶりは仕方ないのかな?) なにか良い方法(アルゴリズム)がありましたらよろしくお願いします。

  • marimo_cx
  • ベストアンサー率25% (873/3452)
回答No.1

作り置きしてあるカードをダブらないように配付するのは別に負荷なんかかからないように思うのですが、どんなもんでしょう?

ssshiro
質問者

お礼

ご回答、ありがとうございます。 確かにあらかじめカードを作っておけば、番号の並びがだぶらないカードを配布する事はできるのですが、その肝心の「番号の並びがだぶらないカード」を作る方法がよくわからないので、困っています…。 乱数を利用して、番号の並びを変えても、同じ並びのカードができないとは言い切れないですし…。(やっぱり、多少のだぶりは仕方ないのかな?) なにか良い方法(アルゴリズム)がありましたらよろしくお願いします。

関連するQ&A

  • ビンゴ 2枚目のカード

    ビッグローブのビンゴ大会 の2枚目のカードの取得方法がわかりません 「javvascript」をONする 「cookie」を有効にするをやりましたが駄目でした 一体どうすればスタンプを獲得できるのかわかりません わかる方 教えてください なおもちろんログインはしている状態です

  • EXCELでビンゴゲームのようなものを作りたいのですが・・・

    すみません。お知恵を拝借したく存じます。 EXCEL2003にて、ビンゴゲームのようなものを作りたいと思っています。 例C1~G5に1から25までの数字をランダムに入力し、  A1~A5に抽選番号(1~25)を入力すると、  C1~G5に入力した番号を検索し、そのセルに色を塗りたいのですが、  EXCEL2003では条件付書式が3つまでしか使えないため、  例のように4つ以上の条件がある場合での方法はないものでしょうか?  何か関数があるのでしょうか?VBAを使えばできるのでしょうか? よろしくお願いいたします。

  • biglobe ビンゴの6番目ボーナス数字が獲得できない?

    開催中の「biglobe ビンゴ」の6番目ボーナス数字が獲得できない? 入力方法をご指導下さい。(自分で何やってんだろうと思うが出来ないので)

  • 写真が出るビンゴマシーンは可能でしょうか

    ビンゴで使用するビンゴマシーンをexcelで作成できると聞いたのですが、 数字ではなく写真などがでてくるように出来るものでしょうか? 数字ではなく名前ビンゴを作成しております。4×4のマスに名前を書いたカードに対して24人分の名前を用意しています。タブレットに数字ではなく24人分の写真がランダムに出てくる設定ができればきっと盛り上がると思うのですが。 数字をランダムで選び一度使った数字を重複させないことができるのであれば、そこに写真を関連づけるのは難しいことなのでしょうか? 何か良い関数なり方法はありますでしょうか? エクセルはあまり理解していないので出来ましたら具体的なやり方(数式?)を記述していただけるととても有難いです。 エクセル以外でももし方法があるなら教えて頂きたいです。 よろしくお願いいたします。

  • ビンゴゲームの当選者数を限定する方法はありませんか?

    今度、イベントでビンゴゲームをすることになりました。 景品数が限られているため10人ちょうどの当選者としたいのですが、 ゲームの性質上、同時にビンゴが出て10人を超える可能性があります。 できればジャンケンなどで2次抽選をしたくないので、あらかじめ用意するカードや使用する数字等で論理的に当選者数を限定することができればいいなと考えていますが、そのようなことは可能でしょうか。 条件等は以下のとおりです。  ・参加者は50名、当選者は10名。(多少の前後は可)  ・カード、抽選箱は手作りを予定。(使う数字の限定可) 追加として  ・うっかりしてビンゴに気がつかない人も想定して、11人目12人目も順次決定できるとなお良し! 数学的に考えてできそうな気もするのですが、いろいろ考えてもいい方法が思いつきませんでした。 どうぞよろしくお願いいたします!

  • CGI自体がよくわかりません

    CGIの入門書など読んでいますが、HTLMとの関係がわかりません。例えばアクセスカウンターCGIの場合、CGIは結果的にHTLMを生成するものなのですか、それともカウント数だけを返す関数なのでしょうか。多くのCGIの場合、どうも前者的な使用方法になっているような気がします。後者の方が効率的に感じます。実際はどうなのでしょうか。

    • ベストアンサー
    • CGI
  • ビンゴカードの数字をPCにスキャンしたい・・

    リーチの掛かったビンゴカードをスピーディーに照合したいのです。織り込んだカードを裏返してその数字を読み込み、PCに入力してあるヒット数字と照合する仕組みです。既にEXCELで照合する仕組みを作っています。(仕組みは末尾に表記) 頂きたいアイデアは、(1)数字を読み込む方法。(2)PCに貼り付ける方法です(後述の「表2」に)。 「EXCELの照合仕組み」  「表1」にヒット数字を入力する。 「表2」はリーチカードを(今は)手動入力する。  「表2」の中の数字で「表1」に無い数字のセルのパターンがの色が変わる。  以上の仕組みです。

  • CGIゲーム「MONSTER’S」について

    始めて質問させていただきます。 自分はHPにCGIを設置する技術はあるのですが、CGIを改造する技術がありません。 HPに設置するときに他の人のHPにあるものと差を付けたいのでよろしければ回答お願いします。 改造したいところ ・決められた階にボスを出現 ・モンスターを仲間にすると自動的に登録される図鑑 ・ユーザー同士で戦闘ができるシステム モンスターを増やす方法だけは分かっています。 どうか、この初心者に助言をください。 MONSTER'S配布元 http://park16.wakwak.com/~mikio-palace/

    • 締切済み
    • CGI
  • こんなCGIを知りませんか?

     飲食店をやっていて、ホームページで登録して頂いたお客様の誕生日に割引のクーポン券の付いたバースデイはがき(?)をお送りしたいんで、下記のようなCGIを知ってる方は、いませんか?  ホームページ上で、お名前、住所、電話番号、生年月日を登録してもらい、管理者(のみ)がそれを閲覧できる。その時に、誕生日の月日順でソートされているか、ソートできるものか、最初から、月別に表示される仕組みの物。  できたら、登録ありがとうございましたメールが自動で返信できるやつですとベスト!!です。

    • 締切済み
    • CGI
  • javaプログラミング

    ただいまjavaで3×3のビンゴの制作で練習しております。 ビンゴカードの数字、ビンゴのボール?の数字を1~9で制作しました。 まず、一つの配列に1~9の数字をランダムで配置し、そしてそれを3×3の二次元配列で配置し、そしてさらにもう一つの配列にビンゴボールの番号をランダムで配置し、照らし合わせていくというプログラムを作りました。 3×3の数字で、出てきたボールの数字と対応した、二次元配列にある数字を0に変更(入れ替え)というところまで、できました。そこで最後にビンゴかどうかの判定をするところで詰まってしまいまして、縦、横、ななめいづれかに0が並ぶとビンゴ達成なのですが、ビンゴの判定方法のソースコードがわかりません。for文で回してみたりif文でやってみたりしたのですがどれもダメでした。一例や、ヒントなど。回答よろしくお願いします。 色々調べてみたのですが、自分のように全部配列に入れて動かしているソースが見つからず質問させていただきました。