我需要使用x位数创建一个随机数。
因此,假设x为5,我需要一个数字,例如。35562如果x为3,则它将抛出类似的内容;463
有人可以告诉我这是怎么做的吗?
Answers:
这是一个简单的解决方案,没有任何循环或麻烦,可让您创建包含字符,数字甚至特殊符号的随机字符串。
$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);
$x
数字的数字,而不是某个数字和之间的数字$x
。
我能想到的最简单的方法是将rand
函数与str_pad
<?php
echo str_pad(rand(0,999), 5, "0", STR_PAD_LEFT);
?>
在上面的示例中,它将生成0到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 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;
}
您可以使用mt_rand()函数生成任何x位数的随机数。使用rand()函数语法mt_rand()
或可以更快mt_rand()mt_rand($min , $max)
。
例如: <?php echo mt_rand(); ?>
这是生成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/zh/function.rand.php
此函数不会生成加密安全值,并且不应将其用于加密目的。如果需要密码安全的值,请考虑改用random_int(),random_bytes()或openssl_random_pseudo_bytes()。
相反,最好使用random_int()
PHP 7上提供的(请参见: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()
如果您不需要安全的随机数,可以使用。
Remember random number generation is not truly random
让我再次困惑。您的意思是因为肯定会有某种模式或算法在后台运行?如果这就是您的意思,那么隐藏生成过程是否足够的安全性?
你们真的很喜欢使事情复杂化:)
真正的问题是,OP可能希望将其添加到一些非常大的数字的末尾。如果没有,我没有必要考虑这一点。因为任何数量的左零都是左零。
因此,只需将该数字的较大部分附加为数学和,而不是字符串。
例如
$x = "102384129" . complex_3_digit_random_string();
变成
$x = 102384129000 + rand(0, 999);
完成。