2011-11-29 40 views
0

我想構建一個以隨機順序輸出的3個提供數組。我有下面的代碼,雖然它輸出3個隨機提供它看起來不是隨機的。生成的數組中的第一個值總是似乎來自我的offer表中的前2個記錄。優惠表只有5條記錄(我不知道這是否影響了事情)。我在PHP中創建了一個隨機數組,並且我的代碼似乎沒有輸出真正的隨機答案

$arrayOfferCount = $offerCount-1; 
$displayThisManyOffers = 3; 

$range = range(0, $arrayOfferCount); 
$vals = array_rand($range, $displayThisManyOffers);` 

任何幫助或建議,將不勝感激。

+0

http://www.etoan.com/random-number-generation/dilbert2001182781025.gif – Julien

+0

人類擅長檢測圖案,甚至沒有存在的地方。 array_rand將生成隨機數,但由於您只有5件事要隨機化,因此它看起來像沒有任何模式。 –

回答

1

我知道mt_rand() PRNG好多了。

然而,在你的情況下,你需要讓數據庫中選擇他們爲你

SELECT * FROM ads ORDER BY RAND() LIMIT 0, 3 
+0

感謝您的。讓生活變得更加輕鬆,並且剝離了大約20行代碼。 Thansk再次! –

+3

請注意,如果表變大或查詢變得更復雜,則ORDER BY RAND()可能會非常慢。對於這種情況,這是一個很好的選擇,因爲你只有5條記錄。 – mfonda

+0

感謝有關此解決方案潛在信息緩慢的信息......我應該關注哪種表格大小 - 我的猜測是,這張表格永遠不會超過500條記錄 - 您認爲這會是一個問題嗎? –

0

它可能隨機挑選要顯示的內容,但按照它們在數組中顯示的順序顯示它們。如果你做了足夠多的時間(〜20),你應該讓第三個人出現一次,如果是這樣的話(選擇5中最後3個的機會是5 * 4中的1個,所以每20個人中有一個會看到第三個選項出現)。

+0

感謝您的想法任何想法如何我可以重寫這段代碼,使它更隨機......甚至支持那些在表格後面出現的優惠......與我目前看來的相反 –

2

工作在這裏很好。基準過來大量的運行,而不只是直覺的...這裏是1000次嘗試:

<?php 

$offerCount = 5; 
$arrayOfferCount = $offerCount-1; 
$displayThisManyOffers = 3; 

$range = range(0, $arrayOfferCount); 

for($i = 0; $i < 1000; $i++) { 
    $vals = array_rand($range, $displayThisManyOffers); 

    foreach($vals as $val) { 
     $counts[$val]++; 
    } 
} 

sort($counts); 
print_r($counts); 

生成:

Array 
(
    [0] => 583 
    [1] => 591 
    [2] => 591 
    [3] => 610 
    [4] => 625 
) 
0

array_rand似乎無法正常工作有時(見PHP-手冊評論)。

解決方法:把數組大小,並使用該函數挑選一個隨機索引mt_rand