簡體   English   中英

php隨機x位數

[英]php random x digit number

我需要創建一個具有 x 位數的隨機數。

所以讓我們說 x 是 5,我需要一個數字,例如。 35562 如果 x 是 3,那么它會拋出類似的東西; 463

有人可以告訴我這是如何完成的嗎?

您可以將rand()pow() rand()一起使用來實現這一點:

$digits = 3;
echo rand(pow(10, $digits-1), pow(10, $digits)-1);

這將輸出一個介於 100 和 999 之間的數字。這是因為 10^2 = 100 和 10^3 = 1000,然后您需要將其減去 1 以使其處於所需范圍內。

如果 005 也是一個有效示例,您可以使用以下代碼用前導零填充它:

$digits = 3;
echo str_pad(rand(0, pow(10, $digits)-1), $digits, '0', STR_PAD_LEFT);

我通常只使用RAND() http://php.net/manual/en/function.rand.php

例如

rand ( 10000 , 99999 );

為您的 5 位隨機數

這是一個沒有任何循環或任何麻煩的簡單解決方案,它允許您創建帶有字符、數字甚至特殊符號的隨機字符串。

$randomNum = substr(str_shuffle("0123456789"), 0, $x);

其中$x可以是位數

例如。 substr(str_shuffle("0123456789"), 0, 5);

幾次執行后的結果

98450
79324
23017
04317
26479

您也可以使用相同的代碼來生成隨機字符串,就像這樣

$randomNum=substr(str_shuffle("0123456789abcdefghijklmnopqrstvwxyzABCDEFGHIJKLMNOPQRSTVWXYZ"), 0, $x);

$x = 11結果

FgHmqpTR3Ox
O9BsNgcPJDb
1v8Aw5b6H7f
haH40dmAxZf
0EpvHL5lTKr

您可以將rand($min, $max)用於該確切目的。

為了將值限制為 x 位的值,您可以使用以下命令:

$x = 3; // Amount of digits
$min = pow(10,$x);
$max = pow(10,$x+1)-1);
$value = rand($min, $max);

將您的號碼視為數字列表,每次只附加一個隨機數字:

function n_digit_random($digits) {
  $temp = "";

  for ($i = 0; $i < $digits; $i++) {
    $temp .= rand(0, 9);
  }

  return (int)$temp;
}

或者純粹的數值解:

function n_digit_random($digits)
  return rand(pow(10, $digits - 1) - 1, pow(10, $digits) - 1);
}

我能想到的最簡單的方法是將rand函數與str_pad一起str_pad

<?php
echo str_pad(rand(0,999), 5, "0", STR_PAD_LEFT);
?>

在上面的例子中,它將生成0 到 999范圍內的隨機數。

並且有5位數。

function random_numbers($digits) {
    $min = pow(10, $digits - 1);
    $max = pow(10, $digits) - 1;
    return mt_rand($min, $max);
}

在這里測試。

rand(1000, 9999); rand(0,9); x4 倍更快rand(0,9);

基准:

rand(1000, 9999)      : 0.147 sec.
rand(0,9)x4 times     : 0.547 sec.

兩個函數都在 100000 次迭代中運行,以使結果更加明確

那么你可以使用簡單的 php 函數 mt_rand(2000,9000) 它可以生成一個 4 位隨機數

mt_rand(2000,9000) 
function random_number($size = 5)
{
    $random_number='';
    $count=0;
    while ($count < $size ) 
        {
            $random_digit = mt_rand(0, 9);
            $random_number .= $random_digit;
            $count++;
        }
    return $random_number;  
}

用循環來做:

function randomWithLength($length){

    $number = '';
    for ($i = 0; $i < $length; $i++){
        $number .= rand(0,9);
    }

    return (int)$number;

}

randmt_rand會做...

用法:

rand(min, max);

mt_rand(min, max);

您可以使用 mt_rand() 函數生成任何 x 位隨機數。 mt_rand() 使用 rand() 函數語法要快得多: mt_rand()mt_rand($min , $max)

閱讀更多

示例: <?php echo mt_rand(); ?> <?php echo mt_rand(); ?>

以下是生成特定長度驗證碼的簡單方法。 長度可以指定,默認生成4位代碼。

function get_sms_token($length = 4) {

    return rand(
        ((int) str_pad(1, $length, 0, STR_PAD_RIGHT)),
        ((int) str_pad(9, $length, 9, STR_PAD_RIGHT))
    );
}

echo get_sms_token(6);

這個簡單的腳本會做

$x = 4;//want number of digits for the random number
$sum = 0;


for($i=0;$i<$x;$i++)
{
    $sum = $sum + rand(0,9)*pow(10,$i);

}

echo $sum;

這是另一個生成 N 位隨機數的簡單解決方案:

$number_of_digits = 10;
echo substr(number_format(time() * mt_rand(),0,'',''),0,$number_of_digits);

在這里檢查: http : //codepad.org/pyVvNiof

function rand_number_available($already_mem_array,$boundary_min,$boundary_max,$digits_num)
{

    $already_mem_array_dim = count($already_mem_array);         // dimension of array, that contain occupied elements

    // --- creating Boundaries and possible Errors
    if( empty($digits_num) ){   
            $boundary_dim = $boundary_max - $boundary_min;
            if($boundary_dim <= 0){
                $error = -1;                                    // Error that might happen. Difference between $boundary_max and $boundary_min must be positive
            }else{
                $error = -2;                                    // Error that might happen. All numbers between, $boundary_min and $boundary_max , are occupied, by $already_mem_array
            }                                   
    }else{
            if($digits_num < 0){                                // Error. If exist, $digits_num must be, 1,2,3 or higher
                $error = -3; 
            }elseif($digits_num == 1){                          // if 'one-figure' number
                $error = -4;                                    // Error that might happen. All 'one-figure' numbers    are occupied, by $already_mem_array
                $boundary_min = 0;
                $boundary_max = 9;
                $boundary_dim = $boundary_max-$boundary_min;
            }elseif($digits_num == 2){                          // if 'two-figure' number
                $error = -5;                                    // Error that might happen. All 'two-figure' numbers    are occupied, by $already_mem_array
                $boundary_min = 10;
                $boundary_max = 99;
                $boundary_dim = $boundary_max-$boundary_min;
            }elseif($digits_num>2){                             // if 'X-figure' number. X>2
                $error = -6;                                    // Error that might happen. All 'X-figure' numbers  are occupied, by $already_mem_array. Unlikely to happen
                $boundary_min = pow(10, $digits_num-1);         // stepenovanje - graduation
                $boundary_max = pow(10, $digits_num)-1;
                $boundary_dim = $boundary_max-$boundary_min;
            }

    }
    // -------------------------------------------------------------------


    // --- creating response ---------------------------------------------
    if( ($already_mem_array_dim <= $boundary_dim)   &&  $boundary_dim>0 ){              // go here only if, there are AVAILABLE numbers to extract, and [difference] $boundary_dim , is positive
        do{
            $num = rand($boundary_min,$boundary_max);
        }while( in_array($num, $already_mem_array) );
        $result = $num;
    }else{
        $result = $error;                                       // Limit that happened  
    }

    return $result;
    // -------------------------------------------------------------------

}

此功能完美運行,沒有重復和所需的位數。

$digits = '';
function randomDigits($length){
    $numbers = range(0,9);
    shuffle($numbers);
    for($i = 0; $i < $length; $i++){
        global $digits;
        $digits .= $numbers[$i];
    }
    return $digits;
}

您可以調用該函數並傳遞位數,例如:

randomDigits(4);

樣本結果:

4957 8710 6730 6082 2987 2041 6721

原始腳本來自這個要點

請注意rand()不會根據文檔生成加密安全值:

http://php.net/manual/en/function.rand.php

此函數不生成加密安全值,不應用於加密目的。 如果您需要加密安全值,請考慮改用 random_int()、random_bytes() 或 openssl_random_pseudo_bytes()。

相反,最好使用 PHP 7 上提供的random_int() (參見: http : random_int() )。

因此,要擴展@Marcus 的答案,您應該使用:

function generateSecureRandomNumber($digits): int {
   return random_int(pow(10, $digits - 1), pow(10, $digits) - 1);
}

function generateSecureRandomNumberWithPadding($digits): string {
   $randomNumber = random_int(0, pow(10, $digits) - 1);
   return str_pad($randomNumber, $digits, '0', STR_PAD_LEFT);
}

請注意,如果您不需要安全的隨機數,則使用rand()就可以了。

以下代碼生成一個 4 位隨機數:

echo sprintf( "%04d", rand(0,9999));

你們真的很喜歡把事情復雜化:)

真正的問題是 OP 可能希望將其添加到某個非常大的數字的末尾。 如果沒有,我認為沒有必要這樣做。 因為任何數字中的左零都是左零。

因此,只需將該數字的較大部分附加為數學總和,而不是字符串。

例如

$x = "102384129" . complex_3_digit_random_string();

簡單地變成

$x = 102384129000 + rand(0, 999);

完畢。

暫無
暫無

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

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