簡體   English   中英

10位mt_rand(),第一位無偏

[英]10 digit mt_rand() with unbiased first digit

我想在我的軟件中生成配置文件ID。 mt_rand函數運作良好,但我需要將ID固定為10位數長。 目前,我正在遍歷mt_rand輸出,直到獲得10位數字。 但是我現在面臨的問題是,大多數配置文件ID從1開始,有些從2開始。沒有其他任何一位數字。 我了解發生這種情況是因為mt_rand的范圍,並且它不能產生以3或更多開頭的10位數字。

這是我目前正在做的

for($i = 0; $i < 200; $i++){
    $num = mt_rand();
    if(strlen($num) == 10) echo $num."<br>";
}

如果運行上面的代碼,您將看到所有數字都從1或2開始。有什么辦法可以解決此問題?

編輯:我想我可以翻轉數字,但有些數字以零結尾,無論如何這似乎有點不合時宜。 但是話又說回來,我想隨機數生成本身就是一個hack。

只需將您的ID開頭為1000000001,然后將ID 2開頭為1000000002,將ID 543開頭為1000000543,依此類推?

或者,繼續調用mt_rand(1000000001,min((PHP_INT_SIZE> 4?intval(“ 9999999999”,10):PHP_INT_MAX),mt_getrandmax()))直到獲得數據庫中不存在的ID? (隨着您的數據庫越來越大,這將越來越引起CPU的騷動。當它幾乎滿時,如果花了數十億次迭代和幾分鍾,我也不會感到驚訝。)

為了詳細說明Rizier的建議,確保任何字符串(甚至一串數字)適合給定長度和規則的模子的唯一方法是一次生成一個字符,然后將它們組合在一起

$str = '';
for($loop = 0; $loop < 10; $loop++) {
    $str .= mt_rand(0,9);
}
echo $str;

然后,您可以為此添加規則。 也許您不希望前導0,所以可以為此添加一個規則。 也許您也想要信件。 這將始終為您提供帶有所需規則的隨機字符串。

您可以在此處查看此操作http://3v4l.org/kIRdV

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM