¿Solución alternativa para suhosin.mt_srand.ignore para mezclar constantemente una matriz en PHP?

Tengo un script PHP que necesita aleatorizar una matriz con resultados consistentes, por lo que puede presentar los primeros artículos al usuario y luego pueden obtener más resultados del mismo conjunto mezclado si lo desean.

Lo que estoy usando actualmente es esto (basado en el algoritmo de Fisher Yates, creo):

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; } } 

Lo cual funciona bien en mi instalación local, pero el servidor en el que debe ejecutarse tiene instalado Suhosin, que reemplaza a mt_srand, lo que significa que se ignora la semilla, la matriz se mezcla aleatoriamente y el usuario obtiene resultados duplicados.

Todo lo que he encontrado en Google sugiere que necesito deshabilitar suhosin.mt_srand.ignore (y suhosin.srand.ignore, aunque no estoy seguro si esto último es relevante) así que puse lo siguiente en .htaccess:

 php_flag suhosin.mt_srand.ignore Off php_flag suhosin.srand.ignore Off 

No tengo acceso a php.ini en este servidor, así que AFAIK es la única forma en que puedo hacerlo. El problema es que no tiene ningún efecto – phpinfo () todavía muestra ambas configuraciones como Encendido, mientras que puedo cambiar otras configuraciones de Suhosin usando .htaccess no hay problema.

Así que supongo que lo que estoy buscando es una forma de deshabilitar realmente suhosin.mt_srand.ignore (o una razón por la que no está funcionando), o una solución alternativa para generar un generador de números aleatorios desde PHP. ¿O tendré que implementar otro RNG por mi cuenta?

Cualquier ayuda sería muy apreciada. ¡Gracias!

Usando algunas matemáticas básicas y algunos trucos, puedes crear fácilmente tu PROPIA función aleatoria, como acabo de hacer 🙂

Lo siento, no lo he limpiado. Sería mucho mejor en una clase ya que podrías evitar la necesidad de volver a sembrarlo con la semilla anterior. No use una variable estática, ya que le limita a usar solo 1 semilla a la vez (o puede hacer un seguimiento manual de las semillas). OOP resolvería eso. Haz lo que quieras con la función siguiente, pero avísame si la reescribes.

 /** * returns a decimal between 0 and max_number, requires seeding every time and will ALWAYS return the same decimal for the same seed * @copyright scott thompson, all rights reserved * @license MIT (do what you like with this) * @param string $seed * @param int $max_number=100 adjust the maximum number range */ function random_number($seed, $max_number = 100) { //make sure there won't be any deadspace where random numbers will never fill if ($max_number > 0xFFFFFF) { trigger_error("Max random number was to high. Maximum number of " . 0xFFFFFF . " allowed. Defaulting to maximum number.", E_USER_WARNING); $max_number = 0xFFFFFF; } //hash the seed to ensure enough random(ish) characters each time $hash = sha1($seed); //use the first x characters, and convert from hex to base 10 (this is where the random number is obtain) $rand = base_convert(substr($hash, 0, 6), 16, 10); //as a decimal percentage (ensures between 0 and max number) return $rand / 0xFFFFFF * $max_number ; } $seed = 'hello'; print ($seed = random_number($seed)) . '
'; //66.779748605475 print ($seed = random_number($seed)) . '
'; //3.5753311857779 print ($seed = random_number($seed)) . '
'; //13.994396567011 print ($seed = random_number($seed)) . '
'; //70.344917198713 print ($seed = random_number($seed)) . '
'; //4.5583250855401

Espero que esto ayude, Scott