2009-11-10 60 views
2

我有一个在线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); 
    } 

回答

2

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

除了上面的MySQL sollution postet,您可以使用php的风格非常类似:您可以使用session 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); 
+0

我使用了一个基于您发布的信息与上述MySQL解决方案相结合的解决方案。完成后我会在这里发布。 – 2009-11-10 17:56:16

2

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

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

这会散列记录的id列(真正选取任何列)和客户端的IP地址。访问该网站的每个IP地址都会得到不同的排序,但只要其IP保持不变,它就会保持静态。

0

做实际洗牌使用Fisher-Yates shuffle算法。使用每个用户独有的东西在洗牌之前播种prng。

4

我想你的用户在用户表中唯一的ID,那么为什么不干脆

select * from awards order by rand($user_id) 

rand()可以接受,这意味着“种子”

+0

我不知道它接受了种子,一直想知道为什么它有()的 非常有用,但不正是我期待的这个时候。 – 2009-11-10 17:49:03

+2

这是_exactly_你在找什么。 – ntd 2009-11-10 23:45:35