おまけ
予言メーカーは、入力された文字列を元に予言を生成しています。
乱数を使っているわけではないので、同じ文字を入力すれば
同じ結果が帰ってきます。
例)
予言者(あなた)の名前:『予言』
何か一言:『メーカー』
↓表示される予言
希望の地フユガテから戦士が現れる
人々は驚愕して敗走する
死亡・繁栄それらは2006年のことである
~予言『メーカー』第1章~
入力された『予言』『メーカー』を元に予言を生成しました。
何度やっても同じ結果になります。
予言メーカーは、webサイト作成用に作られたプログラム言語
PHPの関数『MD5』を使用しています。
『MD5』とは、「入力された文字を16進数32桁の数値にして返す」
という内容の関数です。
この「16進数32桁の数値」のことを『ハッシュ値』と言います。
『ハッシュ値』は、「あ」では 8f03c3a6dbec1d0f1a5af60947b7b052
「い」では 7657b04993b557a2ee9b36bf280a3ec4
「あい」では c42390b96673a74cc5cfa065f2cb7234 のように
文字によってどのような数値になるか決まっています。
言葉だけではよくわからないので、実際に『MD5』を使って
好きな文字を『ハッシュ値』にしてみましょう。
md5(文字列)
ハッシュ値にしたい文字


予言メーカーは、この文字によって変わる32桁のハッシュ値の
一部分を切り出して、その数値によって出力される
単語を判定しています。
この、およそ日常生活で使用することはないと思われる『MD5』ですが
これによってrand関数を使わずに乱数が作成できるのではないかと考えました。
方法
乱数とは、ランダムな数のことです。
つまり、偏りがあってはいけません。
同じパターンの来ない数値を生成できなければ乱数とは 言えないでしょう。
身近にある中で、二度と同じ数字ができないものがあります。
それは、時間です。
時間を細かく数字化すると、今の一瞬はこの一度だけで
過ぎた後は二度とやってこないことになります。
これを利用して乱数を生成します。
PHPのdate関数で今の時間を算出します。
date('Y/n/d H時 i分 s秒')
今の時間は 2024/11/21 23時 11分 37秒 です。
これに加えmicrotime関数で現在の時間の ミリ秒単位を計測します。
(float)microtime()
0.124764ミリ秒
時刻とミリ秒をつなげます。
20241121231137124764
この数値は今の一瞬だけでしか生成されない重複のない数値です。
これをMD5でハッシュ値に変換します。
20241121231137124764 のハッシュ値は a4e14786db0b6a983f836976961568b9 です。
32桁の数値が生成されました。
こんなに膨大な桁は必要ないので、substr関数を使って
適当な一部分を抜き出します。
substr(文字列,抽出始点,抽出文字数)
e
先ほどのハッシュ値の左から3番目を一文字抜き出しました。
16進数では見にくいので10進数に変換します。
hexdec関数を使用します。
hexdec(数値)
e の10進数値は 14 です。
これでも一応0~15までの乱数になっていると思います。
簡単に1~10の数に直します。
0.625を掛けた後に1を足し、小数点を四捨五入します。
小数点の四捨五入にはroundを使います。
round(数値)
10
1~10までの乱数ができました。
とりあえずこれで完成です。
以上課題終わり。
次へ
予言メーカー
ネタに戻る
トップページ