2013年12月14日土曜日

Bingo! シャッフル機能の実現。(年末ビンゴ大会までに間に合うのか・・?)

Delphi Programing

先日のデベロッパーキャンプでは皆様に本当にお世話になりました。

やましょうです。

アドベントカレンダー通りにBingo用 シャッフルについて書いてみたいと思います。
 まず、ランダムとシャッフルの定義についてです。


ランダムとは感覚的にいうと適当に数字よ!出て来いということです。
(次に同じ番号が出てくる事もありです。)
シャッフルとは、トランプのカードを1枚づつ抜いていって終了するまでは、
同じカードは出てこない。
と言う差違があります。
最近の音楽プレイヤーとか、シャッフルなのに。。ランダムだったりする場合もあるのです。



まず、Delphi XE3のRandom関数を調べます。。 詳しくコードは書かないけど。。。
なんじゃーこの定数は
$08088405 + 1しかも、あとから1を足したのは何故?
1103515245ではないのは何故?とぶつぶつ呟くのでした。
そして、 {$IFDEF LINUX}をみつけ、早く、ubents対応。。"は・や・く"と思ってしまったのです。(完全に脱線しています。)
 

余談は、さておき、

このRandomルーチンを用いてShffleを実現させる方法を検討します。
  1. 100個のバッファを用意して、その番号が選択済みをか判定し、抽選する。
  2. 100個のバッファを用意して、番号を適当に入れ適当に掻き回す。
  3. 線形合同法を用いて抽選を行った様に見せる。
取り急ぎ、1と2を合わせた適当な、ビンゴアプリができました。
まず、作成時に100個のバッファを用意、適当に番号を挿入しながら、
100個に入れ抽選結果を最初に設定。あとでそれをピックアップするという、
いかにも"何も考えてないだろう"と言われても
反論さえできないソースはこちらです。
 問題点はメモリー100byte食っちゃいますし、
時間だって同じ値がなんども抽選されたら、
と思うと夜も寝れませんね。

ともかく、取りあえず年末、ビンゴに間に合いました。よかったです。

完全にやっつけ仕事になってしました。反省です。

それでは、
3.線形合同法を用いて抽選を行った様に見せる。
を行ってみます。

興味のある方はWikiペディアをご覧ください。
本当にこんな式でできるのかよと思いますよね。
  Xn+1 =  (A * Xn + B)  mod  M
できるんです。
aとxiの2byteで実現できます。
ソースはこちら


メモリーを小さくしたいと思うのはすでに時代遅れかな?
と思いつつ、小さいことは良い事と自分に言聞かせる今日この頃でした。

それではみなさん、また、お会いいたしましょう。


0 件のコメント:

コメントを投稿