2011-11-29 38 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