我正在我的数据库中构建一个“代理ID”列表,其中包含以下要求:
到目前为止,我已经完成了第1部分,但我正在努力争取上面的2和3。我的代码如下。
function createRandomAGTNO() {
srand ((double) microtime( )*1000000);
$random_agtno = rand(100000000,900000000);
return $random_agtno;
}
// Usage
$NEWAGTNO = createRandomAGTNO();
有什么想法吗?
答案 0 :(得分:7)
mt_rand
代替rand
。我的示例将使用mt_rand
。至于其余部分 - 你可能会想出一个非常巧妙的数字从线性范围映射到你想要的形式的数字,但让我们蛮力强迫它。这是其中之一,其中,运行时间的理论上限是无限的,但预期的运行时间是有限的,非常小,所以不要太担心。
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)”代码,无论如何这都是不可能的。