PHP には文字列をランダムに並び替える関数である str_shuffle 関数があります。
またメルセンヌ・ツイスター乱数生成器で生成される乱数を定めるシード値を指定する mt_srand 関数があります。これは思いに mt_rand 関数のために疲れます。
str_shuffle, rand, shuffle, array_rand のそれぞれは名前から連想し難いですが、mt_srand でランダムな挙動のシード値を決定できます。シード値を設定できると言うことはランダムな挙動を再現できるということであり、これを用いることで次の様なこともできます。
<?php /* * 'アローラロコン'を'アーロン'に置き換えるプログラム(探索) */ /** @var int $seed 乱数のシード値。これを動かしてお目当ての乱数になる値を探す */ $seed = PHP_INT_MIN; while(true) {// break されるまで無限ループ mt_srand($seed);// 乱数のシード値をセット。 // str_shuffle で文字列をランダムに並び替え // substr で文字列を欲しい文字列の長さまで切り詰める。strlen('アーロン') === 12 $res = substr(str_shuffle('アローラロコン'), 0, 12); if($res === 'アーロン') { // 操作した結果の文字列が期待した結果と同じならループ終了 break; } ++$seed;// ループ続行ならばシード値 } // 目標の結果になったならばループから抜けて結果を echo echo 'seed: ' . $seed . "\n"; echo ' res: ' . $res . "\n";
<?php /* * 'アローラロコン'を'アーロン'に置き換えるプログラム */ mt_srand(-9223372036648298070);// 探索結果のシード値を直接埋め込み // substr したら'アーロン'になる様に'アローラロコン'をstr_shuffle echo substr(str_shuffle('アローラロコン'), 0, 12); // アーロン
str_shuffle 関数による文字列の並び替えが期待通りの結果を返す時のシード値を探索するプログラムとそのシード値を使って文字列を変換するプログラムです。ちなみに上記で使っている-9223372036648298070
は1文字目、3文字目,2文字目,7文字目が先頭から並ぶ挙動をするシード値ですので、更に次の様なこともできます。
mt_srand(-9223372036648298070); echo substr(str_shuffle('こばういけかん'), 0, 12); // こうばん
ランダムを固定する手法の使い道はあまりありませんが(ランダム挙動が組み込んであるプログラムの異常動作の再現用くらい?)思ったより広い範囲のランダムな挙動を mt_srand で制御できるという小ネタでした。