In realtà, ROUND((RAND() * (max-min))+min)
è il modo migliore in MySQL per fare ciò che desideri. È anche il modo migliore in ActionScript, JavaScript e Python. Onestamente, lo preferisco al modo PHP perché è più conveniente.
Poiché non so quante righe restituirai, non posso consigliarti se è meglio usare PHP o MySQL per questo, ma se hai a che fare con un gran numero di valori probabilmente stai meglio usando MySQL.
Addendum
Quindi, c'era una domanda se questo fosse meglio in PHP o MySQL. Invece di entrare in un dibattito sui principi, ho eseguito quanto segue:
<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 è più veloce di circa il 2-3%.
Se usi questo, tuttavia (nota, più colonne restituiscono da MySQL):
<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 risulta indietro del 3-4% (risultati molto incoerenti) (più o meno gli stessi risultati se non utilizzi un'assegnazione dell'indice di matrice per $r[2]).
La differenza principale, a quanto pare, deriva dal numero di record restituiti a PHP e non dal sistema di randomizzazione stesso. Quindi, se hai bisogno della colonna A, della colonna B e di un valore casuale, usa PHP. Se hai solo bisogno del valore casuale, usa MySQL.