通过预设随机排序列表的最有效方式

时间:2009-11-10 16:34:31

标签: php mysql list random

我有一个在线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 个答案:

答案 0 :(得分:4)

我认为您的用户在users表中有唯一ID,所以为什么不简单

 select * from awards order by rand($user_id)

rand()可以接受一个意思为“种子”的论据

答案 1 :(得分:2)

如果数据库表不是很大(因为如果你谈论的是几行,这会使你的数据库融化)。

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

这将散列记录的id列(真正选择任何列)和客户端的IP地址。访问该站点的每个IP地址都将获得不同的排序,但只要其IP确实存在,它就会保持静态。

答案 2 :(得分:2)

最有效的方法可能是为每个用户创建一个完全随机的数组顺序和缓存。

除了上面提到的MySQL sollution之外,您可以使用非常相似的样式:您可以使用会话ID作为随机数生成器的开头,而不是使用该“随机”数字对数组进行洗牌。通过这样做,每当用户请求您的站点时,每个用户都会收到一个不同排序的列表(至少只要会话没有到期)。

<?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);

答案 3 :(得分:0)

使用Fisher-Yates shuffle算法进行实际的改组。使用每个用户独有的东西在shuffle之前播种prng。