Самый эффективный способ упорядочить список по заданному случайному - PullRequest
2 голосов
/ 10 ноября 2009

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

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

Список голосов взят из базы данных, а названия наград предварительно заданы.

Вы знаете, как это сделать?

В итоге я использовал:

  //Shuffle & Organise
    if(is_numeric($pg)) { $start = ($pg*15)-14; $end = $pg*15; $pg = (int) $pg; } else { $start = 1; $end = 15; $pg = (int) 1; }
    if($end>count($vote_name)) { $end = count($vote_name); }
    $vote_boxes = range($start,$end);
    srand($user['id']); 
    shuffle($vote_boxes);

  //Create the voting boxes + js
    foreach($vote_boxes as $row) {
        $content .= vote_form($row);
    }

Ответы [ 4 ]

4 голосов
/ 10 ноября 2009

Полагаю, у ваших пользователей есть уникальные идентификаторы в таблице пользователей, так почему бы просто не

 select * from awards order by rand($user_id)

rand () может принимать аргумент, который означает 'seed'

2 голосов
/ 10 ноября 2009

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

За исключением описанного выше решения MySQL, вы можете использовать php в очень похожем стиле: вы можете использовать идентификатор сеанса в качестве начала для генератора случайных чисел и затем перемешать массив, используя это "случайное" число. Таким образом, каждый пользователь получает отсортированный по-разному список всякий раз, когда он запрашивает ваш сайт (по крайней мере, до тех пор, пока сеанс не истекает).

<?php

  $array = array("Cat", "Dog", "Mouse");

  session_start();
  $session_id_int = (int)session_id();
  srand($session_id_int);

  echo '<pre>BEFORE:'.PHP_EOL;
  print_r($array);

  shuffle($array);

  echo 'AFTER:'.PHP_EOL;
  print_r($array);
2 голосов
/ 10 ноября 2009

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

<?PHP
$ip = $_SERVER['REMOTE_ADDR'];
$sql = "SELECT * FROM table ORDER BY md5(CONCAT(id,'$ip');";
$result = db_query($sql);
?>

Это будет хэшировать столбец идентификатора (на самом деле, выбрать любой столбец) записи и IP-адрес клиента. Каждый IP-адрес, который посещает сайт, будет иметь другой порядок, но он будет оставаться статичным, пока их IP-адрес.

0 голосов
/ 10 ноября 2009

Для фактического перемешивания используйте алгоритм перемешивания Фишера-Йейтса. используйте что-то уникальное для каждого пользователя, чтобы посеять prng перед перемешиванием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...