【PHP】str_shuffle 関数の並び替えは mt_srand で制御できる

  • 2022年7月29日
  • PHP

 PHP には文字列をランダムに並び替える関数である str_shuffle 関数があります。

PHP: str_shuffle – Manual

 またメルセンヌ・ツイスター乱数生成器で生成される乱数を定めるシード値を指定する mt_srand 関数があります。これは思いに mt_rand 関数のために疲れます。

PHP: mt_srand – Manual

 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 で制御できるという小ネタでした。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG