En realidad, ROUND((RAND() * (max-min))+min)
es la mejor manera en MySQL para hacer lo que le gustaría. También es la mejor manera en ActionScript, JavaScript y Python. Honestamente, lo prefiero a PHP porque es más conveniente.
Debido a que no sé cuántas filas devolverá, no puedo aconsejarle si es mejor usar PHP o MySQL para esto, pero si está tratando con una gran cantidad de valores, probablemente esté mejor. utilizando MySQL.
Anexo
Entonces, hubo una pregunta sobre si esto es mejor en PHP o MySQL. En lugar de entrar en un debate sobre principios, ejecuté lo siguiente:
<pre><?php
$c = mysql_connect('localhost', 'root', '');
if(!$c) die('!');
echo mysql_select_db('test', $c)?'Connection':'Failure';
echo PHP_EOL;
echo ':::::::::::::::::::::::::BEGINNING MYSQL RAND::::::::::::::::::::::::::::::'.PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
$r = mysql_query( 'SELECT ROUND(RAND() * (200-10) + 10) FROM dual' );
$r = mysql_fetch_array( $r );
}
$end = microtime(1);
echo ($end - $start) . " for MySQL select".PHP_EOL;
echo ':::::::::::::::::::::::::BEGINNING PHP RAND::::::::::::::::::::::::::::::' .PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
$r = mysql_query( 'SELECT 200 AS two, 10 AS tem FROM dual' );
$r = mysql_fetch_array( $r );
$r[2]= rand($r[0], $r[1]);
}
$end = microtime(1);
echo ($end - $start) . " for PHP select".PHP_EOL;
MySQL es más rápido entre un 2 y un 3%.
Sin embargo, si usa esto (tenga en cuenta que MySQL devuelve más columnas):
<pre><?php
$c = mysql_connect('localhost', 'root', '');
if(!$c) die('!');
echo mysql_select_db('test', $c)?'Connection':'Failure';
echo PHP_EOL;
echo ':::::::::::::::::::::::::BEGINNING MYSQL RAND::::::::::::::::::::::::::::::'.PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
$r = mysql_query( 'SELECT ROUND(RAND() * (200-10) + 10) as rd, 200 as two, 10 as ten FROM dual' );
$r = mysql_fetch_array( $r );
}
$end = microtime(1);
echo ($end - $start) . " for MySQL select".PHP_EOL;
echo ':::::::::::::::::::::::::BEGINNING PHP RAND::::::::::::::::::::::::::::::' .PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
$r = mysql_query( 'SELECT 200 AS two, 10 AS tem FROM dual' );
$r = mysql_fetch_array( $r );
$r[2]= rand($r[0], $r[1]);
}
$end = microtime(1);
echo ($end - $start) . " for PHP select".PHP_EOL;
MySQL se queda atrás en un 3-4% (resultados muy inconsistentes) (sobre los mismos resultados si no usa una asignación de índice de matriz para $r[2]).
La principal diferencia, al parecer, proviene de la cantidad de registros devueltos a PHP y no del sistema de aleatorización en sí. Entonces, si necesita la columna A, la columna B y un valor aleatorio, use PHP. Si solo necesita el valor aleatorio, use MySQL.