Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   rand в php два рендома друг с другом связаны (https://javascript.ru/forum/server/8335-rand-v-php-dva-rendoma-drug-s-drugom-svyazany.html)

subzey 22.03.2010 13:40

Gvozd,
да я и не спорю про эффективность. Что может быть шустрее, чем выборка двух значений по полю-индексу? (Более того, поколдовал я и так и сяк, и с JOIN и с "LIMIT {random}, 1", при нескольких тысячах строк результаты ужасают.)

Просто тогда надо быть очень внимательным и держать id в чистоте и порядке.

Да, и багрепорт, видимо, проигнорировали.

// допустим, $kol = 1;
$rnd = rand(1, $kol); // 1, всегда
while( ($rnd2 = rand(1, $kol)) ==$rnd); // бесконечный цикл

Gvozd 22.03.2010 15:51

Цитата:

Сообщение от 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

subzey 22.03.2010 20:22

Сообщение не дошло (долбаный MTS!).

Лениво переписывать тираду, да и не вспомню уже, вкратце, проверил на живом сервере, а не дома на денвере, и метод с LIMIT оказался действительно неплох (0,02 с для 36000 строк).

Вот, только с ORDER BY он работает на порядок медленнее, действительно ли он нужен, учитывая, что порядок строк нам не особо-то и нужен.

Gvozd 22.03.2010 21:15

Цитата:

Сообщение от subzey
действительно ли он нужен

да нафих не сдался, если уж на то пошло.
Цитата:

Сообщение от subzey
работает на порядок медленнее

а поле проиндексировано?

Jekel 25.03.2010 14:48

Теперь нужно три картинки выводить...три юзера. Как в этом случае сделать? так 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;
?>

Gvozd 25.03.2010 15:50

$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;
    }

Kolyaj 25.03.2010 16:03

$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 равномерно распределённых случайных чисел.

Gvozd 25.03.2010 16:14

Kolyaj,
обоснуй
не очень-то похоже, что это будет равномерная выборка
более того, она и вправду неравномерная
для выборки 3х элементов из 4х, оно дает:
7 перестановок "123"
5 перестановок "124"

Jekel 25.03.2010 16:27

Не могу вьехать как его влепить туда....пожалуйста, можно на моем примере?

Gvozd 25.03.2010 16:53

Цитата:

Сообщение от Jekel
Не могу вьехать как его влепить туда

я дико извиняюсь, но это совсем элементарщина
код, не такой уж сложный, и полагаю без комментариев должно быть ясно что он делает, и как использовать его результат


Часовой пояс GMT +3, время: 05:25.