PHP中的随机ID /数字生成器

时间:2010-07-27 20:09:17

标签: php random

我正在我的数据库中构建一个“代理ID”列表,其中包含以下要求:

  1. ID必须为9位数字(仅限数字)
  2. ID不得超过3个相同的数字。
  3. ID不得连续包含超过2个相同数字(即887766551;不能有888 ..)
  4. 到目前为止,我已经完成了第1部分,但我正在努力争取上面的2和3。我的代码如下。

    function createRandomAGTNO() {
        srand ((double) microtime( )*1000000);
        $random_agtno = rand(100000000,900000000);
        return $random_agtno;
    }
    
    // Usage
    $NEWAGTNO = createRandomAGTNO();
    

    有什么想法吗?

4 个答案:

答案 0 :(得分:7)

  1. 不会在每次这样的通话中重新播种RNG,除非您想要完全破坏随机数的安全性。
  2. 除非你的PHP很老,否则你可能根本不需要重新种植RNG,因为PHP会在启动时为你播种,并且很少有你需要用你的一个替换种子的情况自己选择。
  3. 如果您可以使用,请使用mt_rand代替rand。我的示例将使用mt_rand
  4. 至于其余部分 - 你可能会想出一个非常巧妙的数字从线性范围映射到你想要的形式的数字,但让我们蛮力强迫它。这是其中之一,其中,运行时间的理论上限是无限的,但预期的运行时间是有限的,非常小,所以不要太担心。

    function createRandomAGTNO() {
      do {
        $agt_no = mt_rand(100000000,900000000);
        $valid = true;
        if (preg_match('/(\d)\1\1/', $agt_no))
          $valid = false; // Same digit three times consecutively
        elseif (preg_match('/(\d).*?\1.*?\1.*?\1/', $agt_no))
          $valid = false; // Same digit four times in string
      } while ($valid === false);
      return $agt_no;
    }
    

答案 1 :(得分:1)

对于第二个条件,您可以创建一个这样的数组

$a = array( 0,0,1,1,2,2,3,3.....,9,9 );

获取随机元素:array_rand()(参见手册)获取数字,将其附加到您的ID并通过在索引处取消设置从源数组中删除值。

一般来说,这也解决了第三个条件,但是这个解决方案排除了所有ID的可能和可接受的三位数

答案 2 :(得分:0)

首先想到的解决方案是一个递归函数,只需测试您的三个要求,并在其中任何三个失败时重新启动。不是最有效的解决方案,但它会起作用。我在下面写了一个未经测试的版本。可能无法正常运行,但您应该从中获得基本想法。

function createRandomAGTNO(){
  srand ((double) microtime( )*1000000);
  $random_agtno = rand(100000000,900000000);

  $random_agtno_array = explode('', $random_agtno);

  foreach($random_agtno_array as $raa_index => $raa){
    if($raa == $random_agtno_array[$raa_index + 1] && raa == $random_agtno_array[$raa_index + 2]) createRandomAGTNO();

    $dup_match = array_search($raa, $random_agtno_array);
    if($dup_match){
      unset($random_agtno_array[$dup_match]);
      if(array_search($raa, $random_agtno_array)) createRandomAGTNO();
    };
  }

  return $random_agtno;
}

答案 3 :(得分:0)

试试这段代码:

<?php
function createRandomAGTNO() {
    //srand ((double) microtime( )*1000000);
    $digits = array( 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ,1, 2, 3, 4, 5, 6, 7, 8, 9, 0 );
    shuffle($digits);
    $random_agtno = 0;
    for($i = 0; $i < 9; $i++)
    {
        if($i == 0)
        {
            while($digits[0] == 0)
                shuffle($digits);
        }
        /*if($i >= 2)
        {
            while(($random_agtno % 100) == $digits[0])
                shuffle($digits);
        }*/
        $random_agtno *= 10;
        $random_agtno += $digits[0];
        array_splice($digits, 0, 1);
    }
    return $random_agtno;
}

for($i = 0; $i < 1000; $i++)
{
    $NEWAGTNO = createRandomAGTNO();
    echo "<p>";
    echo $NEWAGTNO;
    echo "</p>";
}
?>
祝你好运!

编辑: 删除了对srand()的调用,并注释掉了“if($ i&gt; = 2)”代码,无论如何这都是不可能的。