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)

Jekel 20.03.2010 00:19

rand в php два рендома друг с другом связаны
 
Как сделать так, чтобы $rnd2 не учитывало $rnd? Тоесть чтобы $rnd никогда не было равно $rnd2.:blink:
$kol = mysql_num_rows(mysql_query("SELECT * FROM writers"));

$rnd = rand(1, $kol);

$db1 = mysql_fetch_assoc(mysql_query("SELECT * FROM writers WHERE id='".$rnd."'"));

$rnd2 = rand(1, $kol);

$db2 = mysql_fetch_assoc(mysql_query("SELECT * FROM writers WHERE id='".$rnd2."'"));

Gvozd 20.03.2010 00:33

да тысяча способов.
while( ($rnd2 = rand(1, $kol)) ==$rnd);

subzey 20.03.2010 00:53

Гхм… Если Вам нужно две различные случайные строки из таблицы, то так и составляйте запрос:
Код:

SELECT * FROM `writers` ORDER BY RAND() LIMIT 2
UPD: Надеюсь, столбец id хотя бы уникальный?

Gvozd 20.03.2010 01:23

subzey,
вы в своем уме?
сложность вычислений при таком запросе O(N*lg(N))
и все это ради двух строчек.
В то время, как способ Jekel делает это за O(lg(N))
Разницу чуствуете?
PS Вспомнилось

subzey 20.03.2010 01:45

Gvozd,
вроде, пока да. На стенде, может, это и работает лучше, но как насчет практики?

Авторы никогда не будут удаляться? id всегда-всегда будут идти строго по порядку, а обоспечивать это будут триггеры, или «ручка слива»?

А что, если запись будет всего одна?
while( ($rnd2 = rand(1, 1)) ==$rnd);

Jekel 20.03.2010 02:15

спасибо, while (($rnd2=rand(1, $db1n))==$rnd){} работает)

Gvozd 20.03.2010 06:42

Цитата:

Сообщение от subzey
Авторы никогда не будут удаляться? id всегда-всегда будут идти строго по порядку, а обоспечивать это будут триггеры, или «ручка слива»?

это просто набор исключительных случаев, которые надо описать в логике PHP-скрипта, в пользу производительности.
Цитата:

Сообщение от subzey
На стенде, может, это и работает лучше, но как насчет практики?

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

B@rmaley.e><e 20.03.2010 09:06

А зачем три запроса к одной траблице, когда в результате первого запроса уже все есть?

$res = mysql_query("SELECT * FROM writers"); // как ни крути, тяжеллый запрос
$res_length = mysql_num_rows($res);
$entries = array();
$i = 1;
$rnd1 = rand(1, $res_length);
while( ($rnd2 = rand(1, $res_length)) == $rnd1);

while($row = mysql_fetch_assoc($res)){
   if($i == $rnd1) $entries[0] = $row;
   if($i == $rnd2) $entries[1] = $row;
   $i++;
   if(count($entries) == 2) break;
}

subzey 20.03.2010 11:14

Цитата:

Сообщение от Gvozd
надо описать в логике PHP-скрипта, в пользу производительности.

Вот… это меня и смущает; по-моему, это задача для уровня БД, а не приложения. (Но, возможно, меня просто развратил PostgreSQL).

B@rmaley.e><e,
купить торт и съесть только вишенку. Тоже вариант, только, наверное, вместо while по mysql_fetch_assoc() — mysql_data_seek().

Gvozd 21.03.2010 00:40

Цитата:

Сообщение от subzey
это задача для уровня БД

по логике-да
к сожалению, все известные мне решения на чистом MySQL весьма и весьма непродуктивны.
например ваше решение, как раз и есть то, за что вы осуждаете других
Цитата:

Сообщение от subzey
купить торт и съесть только вишенку

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


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