2012-01-04 89 views
1

我試圖在我的頁面上顯示隨機橫幅來做到這一點我有一個函數,它給了我一個隨機數,並根據數字顯示橫幅問題是有時我得到相同的數字所以當頁面刷新時顯示相同的橫幅。我想在每個頁面刷新顯示不同的橫幅。PHP中的唯一隨機數

進出口使用下面的代碼來獲取隨機數:

function &UniqueRands($min, $max, $keys){ 
    static $returnme = array(); 
    while(in_array($x = rand($min,$max),$returnme)); 
    $returnme[] = $x; 
    if($keys < count($returnme)-1 && $keys < ($max-$min)) 
     UniqueRands($min, $max, $keys); 
    return $returnme; 
} 

$rands = &UniqueRands(1, 3, 1); 
foreach ($rands as $num) { 
    echo "$num\n"; 
} 

後,我得到的隨機數,我只是做

if ($num=1){ 
//display banner 1 
} 

...

我在做什麼錯了,我很樂意聽到任何其他想法。謝謝。

+1

我想你的意思是'if($ num === 1)' – Paulpro 2012-01-04 22:13:38

+1

假設你有'N'個橫幅。在第N + 1次刷新時會發生什麼? – CanSpice 2012-01-04 22:13:46

+2

這聽起來像是一個統計錯誤 - 拋硬幣三次,儘管它有50/50的概率(.5 * .5 *),但仍有13%的機會會連續得到三個正面或反面的尾部。 5 = .125)。嘗試增加'$ min'和'$ max'的範圍。 – buley 2012-01-04 22:16:39

回答

0

您使用的是哪個版本的PHP?由於4.2 rand()函數自動播種,但如果您使用的是較舊的函數,則必須在調用rand()函數初始化隨機數生成器之前使用srand()函數。或者,也許mt_rand()將有所幫助。

2

問題是有時我得到相同的號碼,所以當頁面 刷新顯示相同的橫幅

根據你有多少個橫幅,這是完全可能的。假設你有4個橫幅,連續獲得相同兩個橫幅的機會是1/4。

如果你真的不希望連續兩次顯示同一橫幅,你實際上需要使它更少隨機而不是更多。存儲cookie中顯示的最後一個橫幅或其他內容,然後在選擇下一個橫幅以顯示時確保不顯示該橫幅。

當然,正如CanSpice所說,如果您有4個橫幅並且用戶看起來5個頁面,那麼您將不得不多次顯示一個橫幅。但是使用這種方法至少可以阻止他們連續兩次看到相同的橫幅。

+1

蘋果有完全相同的問題。 http://www.whatdidyoulearntoday.co.uk/post/6692906219/the-ipod-shuffle-feature-was-made-less-random-in-order-t個人而言,當涉及橫幅廣告時,我會提交此文件在「真正不重要」之下,繼續前進。 – James 2012-01-04 22:23:54

+0

假設4個橫幅:兩次獲得第一次的機會是(1/4)x(1/4),兩次獲得第二次的機會是(1/4)x(1/4)等,所以(1/4)×(1/4)+(1/4)×(1/4)+(1/4)×(1/4)+(1/4)× (1/4)或1/4。 – James 2012-01-04 22:28:39