MW211 EXIT

devlog
PHP/一定期間は不動のランダムな値を得る
2011年12月20日
相場(売値と買値)を疑似ってみる。

需給関係の計算とかいろいろやった風にみせて、実は乱数でしたってやつ。
「いろいろやった風」ってのは画面表示にギミックに譲るとして
こちらは乱数の計算に集中するが、
まずは単純に以下のような感じで「1~100」の整数がランダムで取得できる。
┌──────────────────────────────────────┐
│mt_rand(1, 100)                                                             │
└──────────────────────────────────────┘

でも、これだと「いくらで売ってくれる?」って聞いた時、
答えがコロコロ変わる感じだ。
相場っぽくない。

何度も何度も「いくらで売ってくれる?」って尋ねて
うっかり安い価格を相手が言ってきたら即買いみたいな感じになってしまう。

大きな時間軸でみれば実際の株価もそんな感じなのかもしれないが
実際はそんなにコロコロ価格は変わらない。
#失われたうん十年だから問題な訳で、失われた数分だったら
  安値で株を売らずに我慢して持っておくことだって可能だ

ま、それは置いといて、ランダムだけどしばらくの間は同じってのを実現したい。
単純に考えれば一定期間おきに乱数を再計算して更新すればできる。
でもそれだとその値を保持しておく領域が必要だ。

で、乱数ではなくハッシュ。
一日単位でランダムな値を割り当てたい場合はこれ。
┌──────────────────────────────────────┐
│intval(fmod(hexdec(md5(date('Ymd').入力値)), 範囲))                         │
└──────────────────────────────────────┘

例えば、IDの0~9に対して、1~100の範囲で適当な値を与えるとしたら
以下のような感じになる。(画面表示した例)
┌──────────────────────────────────────┐
│for ($id = 0; $id < 10; $id++) {                                            │
│  $result = intval(fmod(hexdec(md5(date('Ymd').$id)), 100)) + 1;            │
│  echo 'id'.$id.'='. $result.'/';                                          │
│}                                                                           │
└──────────────────────────────────────┘
これだと同日中ならIDごとに同じ値となる。

乱数も昔のやつ(?)だと乱数の種を設定しないと、規則性のある乱数、
つまりハッシュっぽくなっていたのだが、
今の乱数は乱数の種の部分もやってくれるので即使える、まさに乱数だ。
その昔N88-BASICをやってた時これがわからずはまってしまった。
ちなみに乱数の種は秒とかころころ変わるものを設定することになるのだけど…、
あれ?なんか似たようなことをしているな…。

最後に注意、これだけだと乱高下必死なので相場としてはもう少し工夫が必要。
分類:PHP