Всъщност, ROUND((RAND() * (max-min))+min)
е най-добрият начин в MySQL да правите това, което искате. Това също е най-добрият начин в ActionScript, JavaScript и Python. Честно казано, предпочитам го пред PHP начина, защото е по-удобен.
Тъй като не знам колко реда ще върнете, не мога да ви посъветвам дали е по-добре да използвате PHP или MySQL за това, но ако имате работа с голям брой стойности, вероятно сте по-добре използвайки MySQL.
Допълнение
И така, имаше въпрос дали това е по-добре в PHP или 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) 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 е по-бърз с около 2-3%.
Ако използвате това обаче (забележете, че повече колони се връщат от 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 изостава с 3-4% (много непоследователни резултати) (приблизително същите резултати, ако не използвате присвояване на индекс на масив за $r[2]).
Основната разлика, изглежда, идва от броя на записите, върнати в PHP, а не от самата система за рандомизиране. Така че, ако имате нужда от колона A, колона B и произволна стойност, използвайте PHP. Ако имате нужда само от произволната стойност, използвайте MySQL.