2012-09-11 27 views
0


我想生成一個隨機的9個字符的長整數。
我也希望確保前3位是不是814
這是我想出了至今與:

函數生成號碼:PHP生成沒有特定前綴的隨機數?

public function randnum(){ 
$random = substr(number_format(time() * rand(),0,'',''),0,9); 
return $random 
} 


,我想得到號碼。

$random; 
while ((substr(randnum(),0,3)) == '814'){ 
$random=substr(randnum(),0,3)); 
} 

這是確保我得到的號碼不是以814開頭的正確方法嗎?

+0

爲什麼不想讓它以814開頭?用這個去除隨機性。 – knittl

回答

3
do { 
    $random = mt_rand(100000000, 999999999); 
} while (strpos($random, '814') === 0); 
+1

這排除了以零開始的所有數字。這是OP想要的嗎? – Jon

+0

@Jon,實際上我更願意允許零。 – chriscct7

+0

如果我將它改爲'mt_rand(000000000,999999999);'會被解釋爲只有一個零還是需要9位數字? – chriscct7

3

這是一個合理的方式來獲得一個不以814開頭的數字,但不是一個合理的方式來獲得一個隨機號碼。您根本不應該參與time(),您應該使用mt_rand而不是rand

你可以這樣做的更好:

do { 
    $random = sprintf("%09d", mt_rand(0, 999999999)); 
} while (substr($random, 0, 3) == "814"); 

如果你不關心生成的隨機數的分佈(即你與次數爲OK剛剛不可預知並沒有真正隨機),你將要產生大量的這些,它可能是有意義的優化一點:

do { 
    $random = sprintf("%03d", mt_rand(0, 999)); 
} while $random == "814"; 

$random = $random.sprintf("%06d", mt_rand(0, 999999)); 
-1

使用的preg_match FUNC:

preg_match("/[^814]/", $str); 

或者使用

str_replace("814", "", $str); 

或者使用

的preg_replace( 「/^814 /」, 「」,$海峽);

+1

所有比substr()或strpos()更慢 – 2012-09-11 19:50:41

+0

當常規字符串比較函數可以工作時(前者慢得多),最好避免使用正則表達式函數。 – theunraveler