【问题标题】:Unique random numbers in PHPPHP中的唯一随机数
【发布时间】:2012-02-02 19:46:20
【问题描述】:

我正在尝试在我的页面上显示随机横幅来执行此操作我有一个功能,它给我一个随机数,根据我显示横幅的数字问题是有时我得到相同的数字所以当页面刷新时显示相同的横幅。我想在每次页面刷新时显示不同的横幅。

我使用以下代码获取随机数:

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
}

...

我做错了什么,我很乐意听到任何其他想法。谢谢。

【问题讨论】:

  • 我想你的意思是if($num === 1)
  • 假设您有N 横幅。 N+1th 刷新会发生什么?
  • 这听起来像是一个统计错误——抛硬币三次,尽管有 50/50 的概率,你仍然有 13% 的机会最终会连续出现三个正面或反面( .5 * .5 * .5 = .125)。尝试增加$min 和$max 的范围。
  • 如果您刷新页面,这是一个新请求,因此会生成一个新的随机数,但之前生成的数字不会在请求之间持久化......为什么您使用 & 引用该函数?

标签: php random numbers unique


【解决方案1】:

问题是有时我得到相同的数字,所以当页面 刷新显示相同的横幅

根据您拥有的横幅数量,这是完全可能的。假设您有 4 个横幅,连续获得相同两个的机会是 1/4。

如果您真的不希望同一条横幅连续显示两次,您实际上需要减少随机性而不是增加随机性。将显示的最后一个横幅存储在 cookie 或其他内容中,然后在选择要显示的下一个横幅时确保不显示那个。

当然,正如 CanSpice 所说,如果您有 4 个横幅并且用户查看 5 个页面,那么您将不得不多次显示一个横幅。但是使用这种方法,您至少可以阻止他们连续两次看到相同的横幅。

【讨论】:

  • 苹果也有同样的问题。 whatdidyoulearntoday.co.uk/post/6692906219/… 就个人而言,当涉及横幅广告时,我会将其归档在“真的不重要”下并继续前进。
  • 假设4个banner:两次获得第一的机会是(1/4)x(1/4),两次获得第二的机会是(1/4)x(1/4) ) 等,因此连续两次获得任何横幅的机会为 (1/4)x(1/4)+(1/4)x(1/4)+(1/4)x(1/4) +(1/4)x(1/4) 或 1/4。
【解决方案2】:

您使用的是哪个版本的 PHP?由于 4.2 rand() 函数是自动播种的,但如果您使用的是旧版本,则必须在调用 rand() 函数之前使用 srand() 函数来初始化随机数生成器。或者mt_rand() 可能会有所帮助。

【讨论】:

    【解决方案3】:

    mt_rand[1] 应该产生更好(“更随机”)的伪随机数,比较 [2]

    [1]http://de.php.net/manual/en/function.mt-rand.php

    [2]http://tjl.co/blog/code/followup-php-rand-vs-mt_rand/

    【讨论】:

      猜你喜欢
      • 2011-06-14
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      相关资源
      最近更新 更多