私は一貫した結果を持つ配列をランダム化する必要があるPHPスクリプトを持っているので、ユーザに最初のいくつかのアイテムを提示することができ、望むのであれば同じシャッフルセットからさらに多くの結果を引き出すことができます。suhosin.mt_srand.ignoreがPHPで配列を一貫してシャッフルするのを回避するには?
は私が現在使用していることは、この(私は信じているフィッシャーイエーツアルゴリズムに基づいて)です:私のローカルインストールで正常に動作します
function shuffle(&$array, $seed)
{
mt_srand($seed);
for ($a=count($array)-1; $a>0; $a--) {
$b = mt_rand(0, $a);
$temp = $array[$a];
$array[$a] = $array[$b];
$array[$b] = $temp;
}
}
が、それはSuhosinがインストールされている上で実行する必要があるサーバー、これはmt_srandをオーバーライドします。つまり、シードは無視され、配列はランダムにシャッフルされ、ユーザーは重複した結果を取得します。私はGoogleで見つけた
すべては私が(後者はしかし関連性があるかどうかわからないとsuhosin.srand.ignore、)ので、私は入れsuhosin.mt_srand.ignoreを無効にする必要が示唆して.htaccessファイルに次の
php_flag suhosin.mt_srand.ignore Off
php_flag suhosin.srand.ignore Off
私はこのサーバ上でphp.iniにアクセスすることができませんので、AFAIKだけがそれを行うことができます。問題はそれは効果がありません - phpinfo()は両方の設定をOnとして表示しますが、.htaccessを使って他のSuhosin設定を変更することはできます。
私が探しているのは、実際にsuhosin.mt_srand.ignore(またはそれが動作しない理由)を無効にする方法か、PHP内から乱数ジェネレータをシードする回避策です。それとも、自分で別のRNGを実装する必要がありますか?
ご協力いただければ幸いです。ありがとう!私はちょうど:)行っているようにあなたが非常に簡単に独自のランダム関数を作成することができますいくつかの基本的な数学といくつかのトリックを使用して
キャッシュのどこかで、結果の配列、... – KingCrunch
らしいです。その性質上、多くのシャッフルを行う必要があります(検索に基づいているため、ユーザーが再配置を検索するたびに)、各シャッフルはおそらく最大2〜3回しか使用されません。それはサイトで頻繁に使われている部分なので、異なるユーザーのために異なる配列のシャッフルされたバージョンをキャッシュしています。多くの場合同じ結果が別々にシャッフルされています各アレイとすべてのアレイをどのくらいの期間保持するかということです。 – alexz
本当に必要なのは、すべてのユーザーが_完全に別のバージョンを表示する必要があるか、複数のユーザーに対して1つのシャッフルセットを使用できないことですか? – KingCrunch