基于PHP rand()的简单链接选择器不太正常

基于PHP rand()的简单链接选择器不太正常,php,random,Php,Random,所以我想把我的流量的5%发送到前三个链接中的每一个,剩下的85%发送到第四个和最后一个(用“else”捕获)。我的兰特范围是1,20 从下面的代码中,为什么我在回显clickref_url时只会看到返回的第3个(约15%的时间)或第4个(约85%的时间)链接,而不是应该获得5%流量的第一个或第二个链接 谢谢大家!!非常感谢。谢谢大家! <?php $rand = rand(1,20); if ($rand == 1) { /* Link1 */ $clickref_url = 'h

所以我想把我的流量的5%发送到前三个链接中的每一个,剩下的85%发送到第四个和最后一个(用“else”捕获)。我的兰特范围是1,20

从下面的代码中,为什么我在回显clickref_url时只会看到返回的第3个(约15%的时间)或第4个(约85%的时间)链接,而不是应该获得5%流量的第一个或第二个链接

谢谢大家!!非常感谢。谢谢大家!

<?php
$rand = rand(1,20);
if ($rand == 1) {
  /* Link1 */
  $clickref_url = 'http://www.link1domain.com?var1='.$email.'&var2=mydomain';
  $clickref_url.= '&firstname='.$firstname;
  $clickref_url.= '&lastname='.$lastname;
  $clickref_url.= '&email='.$email;
  $clickref_url.= '&zipcode='.$zip;
}
if ($rand == 2) {
  /* Link2 */
  $clickref_url = 'http://www.link2domain.com?var1='.$email.'&var2=mydomain';
  $clickref_url.= '&firstname='.$firstname;
  $clickref_url.= '&lastname='.$lastname;
  $clickref_url.= '&email='.$email;
  $clickref_url.= '&zipcode='.$zip;
}
if ($rand == 3) {
  /* Link3 */
  $clickref_url = 'http://www.link3domain.com?var1='.$email.'&var2=mydomain';
  $clickref_url.= '&firstname='.$firstname;
  $clickref_url.= '&lastname='.$lastname;
  $clickref_url.= '&email='.$email;
  $clickref_url.= '&zipcode='.$zip;
} else {
  /* Link4 */
  $clickref_url = 'http://www.link4domain.com?var1='.$email.'&var2=mydomain';
  $clickref_url.= '&firstname='.$firstname;
  $clickref_url.= '&lastname='.$lastname;
  $clickref_url.= '&email='.$email;
  $clickref_url.= '&zipcode='.$zip;
}
?> 

因为您对3/other选项使用了一个带有else的
if
测试,它覆盖了前两个if测试已经完成的任何操作

如果您的初始rand为1,它将为您的
If(rand==1)
,以及
If(rand==3){…}else{…}
else部分执行代码

使用
elseif

$rand = rand(1,20);
if ($rand == 1) {
    /* Link1 */
    $clickref_url = 'http://www.link1domain.com?var1='.$email.'&var2=mydomain';
    $clickref_url.= '&firstname='.$firstname;
    $clickref_url.= '&lastname='.$lastname;
    $clickref_url.= '&email='.$email;
    $clickref_url.= '&zipcode='.$zip;
} elseif ($rand == 2) {
    /* Link2 */
    $clickref_url = 'http://www.link2domain.com?var1='.$email.'&var2=mydomain';
    $clickref_url.= '&firstname='.$firstname;
    $clickref_url.= '&lastname='.$lastname;
    $clickref_url.= '&email='.$email;
    $clickref_url.= '&zipcode='.$zip;
}elseif ($rand == 3) {
    /* Link3 */
    $clickref_url = 'http://www.link3domain.com?var1='.$email.'&var2=mydomain';
    $clickref_url.= '&firstname='.$firstname;
    $clickref_url.= '&lastname='.$lastname;
    $clickref_url.= '&email='.$email;
    $clickref_url.= '&zipcode='.$zip;
} else {
    /* Link4 */
    $clickref_url = 'http://www.link4domain.com?var1='.$email.'&var2=mydomain';
    $clickref_url.= '&firstname='.$firstname;
    $clickref_url.= '&lastname='.$lastname;
    $clickref_url.= '&email='.$email;
    $clickref_url.= '&zipcode='.$zip;
}
由于大多数代码行都是重复的,所以将其简化为

$rand = rand(1,20);
if ($rand == 1) {
    /* Link1 */
    $clickref_url = 'http://www.link1domain.com?var1='.$email.'&var2=mydomain';
} elseif ($rand == 2) {
    /* Link2 */
    $clickref_url = 'http://www.link2domain.com?var1='.$email.'&var2=mydomain';
}elseif ($rand == 3) {
    /* Link3 */
    $clickref_url = 'http://www.link3domain.com?var1='.$email.'&var2=mydomain';
} else {
    /* Link4 */
    $clickref_url = 'http://www.link4domain.com?var1='.$email.'&var2=mydomain';
}
$clickref_url.= '&firstname='.$firstname;
$clickref_url.= '&lastname='.$lastname;
$clickref_url.= '&email='.$email;
$clickref_url.= '&zipcode='.$zip;

为什么不将它们放在一个数组中:-

$urls[1] = "http://www.link1domain.com?var1=$email&var2=mydomain&firstname=$firstname&lastname=$lastname&email=$email&zipcode=$zip";

$urls[2] = "http://www.link2domain.com?var2=$email&var2=mydomain&firstname=$firstname&lastname=$lastname&email=$email&zipcode=$zip";

$count = count($urls);
$index = rand(1,100);
if ($index > $count) { $index = $count; }
$clickref_url = $urls[$index];
我只展示了两个,但很容易添加更多


还有一种连接字符串的更简单的方法

你的样本量有多大?你跟踪了多少?马克·贝克的回答说明了问题的根源,我还建议采取他提到的一些改进措施。为了便于将来参考,使用更简单的脚本进行测试通常会容易得多,例如,用
echo“Rand等于X,这应该在X%的时间内达到”
替换评估中的所有内容。这将使复制和诊断更容易