PHP 随机生成 X 位数字

89
我需要创建一个有x位数字的随机数。
比如,如果x是5,我需要一个类似35562的数字。 如果x是3,则会返回类似463的数字。
有人能向我展示如何做到这一点吗?
22个回答

216

你可以使用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);

2
稍微简洁一点的写法: $digits = 3; echo random_int(10 ** ($digits - 1), (10 ** $digits) - 1); - Mr. Jo
最佳答案。 - STA
2
我决定通过与实际答案的比较来基准测试@Mr.Jo的评论,以下是以纳秒为单位的总执行时间为基础的结果:5个数字=> marcusVersion(): 36,916 ns; mrJoVersion(): 27,769 ns 10个数字=> marcusVersion(): 11,116 ns; mrJoVersion(): 41,748 ns 15个数字=> marcusVersion(): 17,543 ns; mrJoVersion(): 60,442 ns 20个数字=> marcusVersion(): 20,373 ns; mrJoVersion(): 77,534 ns你的选择应该取决于你一次生成多少个数字。 - Enrico
这真是帮我省了一大堆工作。谢谢! - Abdullah Nafees

53

1
这永远不会生成0作为第一个数字。 - Danon

21

以下是一个简单的解决方案,无需任何循环或麻烦,可以让您创建带有字符、数字甚至特殊符号的随机字符串。

$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

4
洗牌似乎是一个不错的主意,但它不会生成像2312、abcb等重复的数字/字符。 - Pranav Raut
@PranavRaut 这段代码允许重复的数字/字符:(假设 $digits 为 5)substr(str_shuffle(str_repeat("0123456789", $digits)), 0, $digits); - hawaii

14
你可以使用rand($min, $max)来实现该目的。
为了将值限制在x位数内,可以使用以下代码:
$x = 3; // Amount of digits
$min = pow(10,$x);
$max = pow(10,$x+1)-1);
$value = rand($min, $max);

OP正在寻找一个有$x位数字的数,而不是在某个数字和$x之间的数字。 - Michael Berkowski
他不知道最小/最大值,只知道預期數字的位數長度。 - Rene Pot
它总是返回1000。 - Shahid Chaudhary

10

把你的数字看作是一串数字列表,在每次追加一个随机数字:

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);
}

8
我能想到最简单的方法是使用rand函数和str_pad
<?php
echo str_pad(rand(0,999), 5, "0", STR_PAD_LEFT);
?>

在上面的例子中,它将在0到999范围内生成随机数。此外,该数字将包含5位。

我认为这是目前提到的最合适和高效的解决方案。它不使用任何循环,也不使用洗牌算法,可以保证数字在结果中出现多次,也不需要大量的代码来确保结果包含x个数字。 - CodeNinja

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

这里 进行了测试。


这会输出带有前导零的数字吗? - user1022585
你需要它有前导零吗?它已经是 x 位数了。编辑:算了,我想我明白你的意思了。不,它不会创建像“093”这样的数字。 - animuson
改变这个难吗?我想无所谓。 - user1022585
如果您想允许像“00937”这样的五位数数字,则更改并不难。 - animuson

6

rand(1000, 9999);rand(0,9);的速度快了4倍以上。

基准测试:

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

为了让结果更明显,这两个函数都运行了100000次。


2
OP正在寻求一种创建x位随机数的方法。也许您可以编辑您的答案以匹配问题? - jorgenkg

5

你可以使用简单的PHP函数 mt_rand(2000,9000) 来生成一个四位数的随机数字。

mt_rand(2000,9000) 

3

您可以使用mt_rand()函数生成任何x位随机数。

mt_rand()rand()更快。

语法:mt_rand()mt_rand($min,$max)

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

阅读更多


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接