22.03.2010, 13:40
|
|
Пионэр
|
|
Регистрация: 16.11.2009
Сообщений: 1,322
|
|
Gvozd,
да я и не спорю про эффективность. Что может быть шустрее, чем выборка двух значений по полю-индексу? (Более того, поколдовал я и так и сяк, и с JOIN и с "LIMIT {random}, 1", при нескольких тысячах строк результаты ужасают.)
Просто тогда надо быть очень внимательным и держать id в чистоте и порядке.
Да, и багрепорт, видимо, проигнорировали.
// допустим, $kol = 1;
$rnd = rand(1, $kol); // 1, всегда
while( ($rnd2 = rand(1, $kol)) ==$rnd); // бесконечный цикл
|
|
22.03.2010, 15:51
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от subzey
|
Да, и багрепорт, видимо, проигнорировали.
|
Сообщение от Gvozd
|
это просто набор исключительных случаев, которые надо описать в логике PHP-скрипта, в пользу производительности.
|
достаточно несложно организовать ф-цию, которая это учтет.
так что это скорее вопрос уже формализации
Сообщение от subzey
|
Просто тогда надо быть очень внимательным и держать id в чистоте и порядке.
|
можно сделать проще:
$rnd = rand(1, $kol);
$db1 = mysql_fetch_assoc(mysql_query("SELECT * FROM writers ORDER BY id LIMIT ".$rnd.",1"));
если я правильно предполагаю, то такой запрос должен отрабатыватся за логарифм, также как и получение по id
|
|
22.03.2010, 20:22
|
|
Пионэр
|
|
Регистрация: 16.11.2009
Сообщений: 1,322
|
|
Сообщение не дошло (долбаный MTS!).
Лениво переписывать тираду, да и не вспомню уже, вкратце, проверил на живом сервере, а не дома на денвере, и метод с LIMIT оказался действительно неплох (0,02 с для 36000 строк).
Вот, только с ORDER BY он работает на порядок медленнее, действительно ли он нужен, учитывая, что порядок строк нам не особо-то и нужен.
|
|
22.03.2010, 21:15
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от subzey
|
действительно ли он нужен
|
да нафих не сдался, если уж на то пошло.
Сообщение от subzey
|
работает на порядок медленнее
|
а поле проиндексировано?
|
|
25.03.2010, 14:48
|
|
Профессор
|
|
Регистрация: 20.11.2009
Сообщений: 257
|
|
Теперь нужно три картинки выводить...три юзера. Как в этом случае сделать? так while ((($rnd3=rand(1, $db1n))==$rnd)==$rnd2); не работает(
<?php
mysql_connect($hostddd, $userdbddd, $passdbddd);
mysql_select_db($databaseddd);
$db1n = mysql_num_rows(mysql_query("SELECT * FROM writers"));
$rnd = rand(1, $db1n);
$db1 = mysql_fetch_assoc(mysql_query("SELECT * FROM writers WHERE id='".$rnd."'"));
$wri = "<a href='index.php?option=com_content&view=article&id=48#".$db1['id']."'>
<img src='http://localhost/writers/".$db1['photo']."'></img></a>
<br>
<b>".$db1['name']."</b><br><span style='font-size: 11px'>Age: ".$db1['age']."</span>
<br><span style='font-size: 11px'>Country of Residence: ".$db1['country']."</span>
<br><span style='font-size: 11px'>Degree: ".$db1['degree']."</span><br><br>";
while (($rnd2=rand(1, $db1n))==$rnd);
$db2 = mysql_fetch_assoc(mysql_query("SELECT * FROM writers WHERE id='".$rnd2."'"));
$wri2 = "<a href='index.php?option=com_content&view=article&id=48#".$db2['id']."'>
<img src='http://localhost/writers/".$db2['photo']."'></img></a>
<br>
<b>".$db2['name']."</b><br><span style='font-size: 11px'>Age: ".$db2['age']."</span>
<br><span style='font-size: 11px'>Country of Residence: ".$db2['country']."</span>
<br><span style='font-size: 11px'>Degree: ".$db2['degree']."</span><br><br>";
echo "<br>".$wri.$wri2;
?>
Последний раз редактировалось Jekel, 26.03.2010 в 00:12.
|
|
25.03.2010, 15:50
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
$max=100;
$count=10;
$rand=array();$temp_rand=NULL;
for($i=0;$i<$count;$i++)
{
while(in_array($temp_rand=rand(1,$max),$rand));
$rand[$i]=$temp_rand;
}
Последний раз редактировалось Gvozd, 25.03.2010 в 23:59.
|
|
25.03.2010, 16:03
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
$max=100;
$count=10;
$rand = array();
for ($i = 0; $i < $count; $i++) {
$rand[$i] = rand(1, $max - $i);
for ($j = 0; $j < $i; $j++) {
if ($rand[$i] >= $rand[$j]) {
$rand[$i]++;
}
}
}
$count равномерно распределённых случайных чисел.
|
|
25.03.2010, 16:14
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Kolyaj,
обоснуй
не очень-то похоже, что это будет равномерная выборка
более того, она и вправду неравномерная
для выборки 3х элементов из 4х, оно дает:
7 перестановок "123"
5 перестановок "124"
Последний раз редактировалось Gvozd, 25.03.2010 в 16:52.
|
|
25.03.2010, 16:27
|
|
Профессор
|
|
Регистрация: 20.11.2009
Сообщений: 257
|
|
Не могу вьехать как его влепить туда....пожалуйста, можно на моем примере?
|
|
25.03.2010, 16:53
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от Jekel
|
Не могу вьехать как его влепить туда
|
я дико извиняюсь, но это совсем элементарщина
код, не такой уж сложный, и полагаю без комментариев должно быть ясно что он делает, и как использовать его результат
|
|
|
|