Уважаемый Chas
вами предложенный вариант я использовал в течении 3 лет программируя на Дельфи, и не разу не было ситуации чтобы он дал сбой!
Чем он вас не устраивает?
Если вас интересет сам код на РНР то ниже он приведен (как советует Нирва):

PHP код:
<?php
$numbers = range(1,20);
srand((double)microtime*1000000);
shuffle($numbers);
for ($i=1; $i<=20; $i++)
{
echo "$numbers[$i]<br>\n";
}
?>
Удачи!