[Ayuda] problema con libreria que genera string aleatorio

Iniciado por Graphixx, 22 Enero 2015, 23:12 PM

0 Miembros y 2 Visitantes están viendo este tema.

Graphixx

Tengo un script de generacion aleatoria de strings, que funciona perfecto en el xampp del portatil, pero en el xampp de la torre no.
Alguna idea de por que siendo la misma instalacion de xampp, el script funciona mal en la torre.


Código (php) [Seleccionar]

<?php
ini_set
('max_execution_time'0);

function 
RandomString($length=10,$uc=TRUE,$n=TRUE,$sc=FALSE)
{
    
$source 'abcdefghijklmnopqrstuvwxyz';
    
//if($uc==1) $source .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
if($uc==1$source .= 'abcdefghijklmnopqrstuvwxyz';
    if(
$n==1$source .= '1234567890';
    
//if($sc==1) $source .= '|@#~$%()=^*+[]{}-_';
    
if($length>0){
        
$rstr "";
        
$source str_split($source,1);
        for(
$i=1$i<=$length$i++){
            
mt_srand((double)microtime() * 1000000);
            
$num mt_rand(1,count($source));
            
$rstr .= $source[$num-1];
        }
 
    }
    return 
$rstr;
}

$link=mysql_connect("localhost","root","");
mysql_select_db("seriales",$link);

require_once 
'Serial.php';
for (
$i 0$i 100$i++) {

    
$cod1 RandomString(6,TRUE,true,false);

$inputString addslashes(strip_tags($cod1));
$inputLength = (int)4;
$serial = new Serial($inputLength);
$serialString $serial->generate($inputString);
   
    
mysql_query("insert into seriales(qr,serial) values('$cod1','$serialString')",$link);
}

mysql_close($link);
?>



En el portatil los string se generan bien, y sale un codigo aleatorio de 6 cifras. Pero cuando lo ejecuto en la torre, pasando el script directamente del portatil a la torre sin tocar nada, el string se queda como que pegado en la primer cifra, no logro entender por que.
Nada tiene fin solo hay pequeñas pausas, pausas que determinan el comienzo de otros. Graphixx
Mi blog

MinusFour

#1
Comenta la linea del srand o prueba con:

Código (php) [Seleccionar]

mt_srand((double)microtime(true) * 1000000);


Edit: Y muevela fuera del for.

Graphixx

Nada tiene fin solo hay pequeñas pausas, pausas que determinan el comienzo de otros. Graphixx
Mi blog

MinusFour


#!drvy

Yo el mt_srand lo veo bien ahí, así genera una nueva semilla por cada iteración. Estas seguro de que son las mismas versiones de XAMPP ?  Y en donde se queda pegado, en la propia función de RandomString o en el for que genera el serial ? No te da ningún error (teniendo display_errors on) ?

Saludos

MinusFour

Cita de: #!drvy en 25 Enero 2015, 21:46 PM
Yo el mt_srand lo veo bien ahí, así genera una nueva semilla por cada iteración. Estas seguro de que son las mismas versiones de XAMPP ?  Y en donde se queda pegado, en la propia función de RandomString o en el for que genera el serial ? No te da ningún error (teniendo display_errors on) ?

Saludos

Realmente no necesitas generar la semilla nuevamente, al generar el numero aleatorio la semilla vuelve a cambiar, por eso solo debería generar la semilla una vez al principio (a menos que este usando la funcion para otra cosa).

Lo que creo que esta pasando aqui es que mt_srand al recibir de parametro un entero, esta truncando los decimales (tecnicamente el unico parametro que recibe la funcion es entero).


Código (php) [Seleccionar]

<?php

mt_srand
(10000.20);
echo 
mt_rand().PHP_EOL;

mt_srand(10000.89);
echo 
mt_rand().PHP_EOL;



╭─m1n054@ALEXPC ~/d/php
╰─ ❯❯❯ php ex1.php
983171632
983171632


Aun así no estoy seguro de porque en una de sus maquinas funciona y en el otro no. Debe ser un error de casting ya sea de doble a entero o de string a double.

Creo que mejor aun sería utilizar el código de la pagina de PHP:

Código (php) [Seleccionar]

function make_seed()
{
  list($usec, $sec) = explode(' ', microtime());
  return (float) $sec + ((float) $usec * 100000);
}
mt_srand(make_seed());


Aunque cabe notar que:

Citar
Nota: Desde PHP 4.2.0, no es necesario usar una semilla para usar el generador de números aleatorios con srand() o mt_srand() ya que ahora se hace automáticamente.

http://php.net/manual/es/function.mt-srand.php