X桁の乱数を作成する必要があります。
したがって、xが5であるとしましょう。たとえば、数字が必要です。 35562 xが3の場合、次のようなものが返されます。 463
誰かがこれがどのように行われるかを教えてもらえますか?
Rand()
を pow()
と組み合わせて使用すると、これを実現できます。
$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($min, $max)
を使用できます。
値をx桁の値に制限するには、次を使用できます。
$x = 3; // Amount of digits
$min = pow(10,$x);
$max = pow(10,$x+1)-1);
$value = Rand($min, $max);
ループや手間をかけずに、文字、数字、または特別な記号を使用してランダムな文字列を作成できる簡単なソリューションを次に示します。
$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
_
数字を数字のリストとして扱い、毎回ランダムな数字を追加するだけです。
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);
}
function random_numbers($digits) {
$min = pow(10, $digits - 1);
$max = pow(10, $digits) - 1;
return mt_Rand($min, $max);
}
テスト済み ここ 。
私が考えることができる最も簡単な方法は、str_pad
でRand
関数を使用することです
<?php
echo str_pad(Rand(0,999), 5, "0", STR_PAD_LEFT);
?>
上記の例では、範囲から999の乱数を生成します。
5桁。
Rand(1000, 9999);
はx4回よりも高速に動作しますRand(0,9);
基準:
Rand(1000, 9999) : 0.147 sec.
Rand(0,9)x4 times : 0.547 sec.
結果をより明確にするために、両方の関数が100000回の反復で実行されていました
ループでそれを行う:
function randomWithLength($length){
$number = '';
for ($i = 0; $i < $length; $i++){
$number .= Rand(0,9);
}
return (int)$number;
}
Rand
またはmt_Rand
しましょう...
使用法:
Rand(min, max);
mt_Rand(min, max);
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;
}
さて、4桁の乱数を生成できるシンプルなPHP関数mt_Rand(2000,9000)として使用できます
mt_Rand(2000,9000)
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;
// -------------------------------------------------------------------
}
これは、N桁の乱数を生成する別の簡単なソリューションです。
$number_of_digits = 10;
echo substr(number_format(time() * mt_Rand(),0,'',''),0,$number_of_digits);
ここで確認してください: http://codepad.org/pyVvNiof
mt_Rand()関数を使用して任意のx桁の乱数を生成できます。 mt_Rand()は、Rand()関数の構文ではるかに高速です:mt_Rand()
またはmt_Rand($min , $max)
。
例:<?php echo mt_Rand(); ?>
このシンプルなスクリプトは
$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;
この機能は、繰り返しがなく、必要な桁数で完全に機能します。
$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
this Gist から取得した元のスクリプト
ドキュメントによると、Rand()
は暗号的に安全な値を生成しないことに注意してください。
http://php.net/manual/en/function.Rand.php
この関数は暗号的に安全な値を生成しないため、暗号化の目的には使用しないでください。暗号的に安全な値が必要な場合は、代わりにrandom_int()、random_bytes()、またはopenssl_random_pseudo_bytes()の使用を検討してください。
代わりに、PHP 7で利用可能なrandom_int()
を使用することをお勧めします(参照: http://php.net/manual/en/function.random- int.php )。
@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()
を使用しても問題ありません。