2009-11-10 61 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