如何生成一个四位数的随机数?

时间:2015-07-28 21:01:14

标签: batch-file random cmd

我试图创建一个批处理文件,以xxxx-xxxx-xxxx-xxxx-xxxx的格式创建一个序列号 - 也就是说,我想要五个随机生成的四位数字。

不幸的是,%random%可以返回5位数,3位数,2位数,甚至1位数。有没有办法保证随机数中有四位数?

这是我到目前为止的代码:

@echo off
goto a
:b
echo it's a 5 digits number!
:a
set "x=%random%-%random%-%random%-%random%-%random%"
if %random% gtr 9999 goto b
echo it worked
echo %x%
pause

2 个答案:

答案 0 :(得分:1)

使用小公式,您可以将随机值(0到32768)的范围更改为更小的值。通过将该计算作为子程序,您可以轻松地多次调用它。

使用setlocal可以防止污染环境。下面的脚本使用随机序列号填充变量serial,该序列号由1000到9999之间的5个数字组成。

版本1:

@echo off
setlocal

:: Generate 5 random numbers of 4 digits
call :random code1
call :random code2
call :random code3
call :random code4
call :random code5

:: Combine them and show the output.
set serial=%code1%-%code2%-%code3%-%code4%-%code5%
echo %serial%
pause

:: Clear all variables, except %serial%
endlocal & set serial=%serial%
goto :eof

:random
:: Version 1: Generates a random number between 1000 and 9999
setlocal
set /a nr=%random%*8999/32767+1000
endlocal & set %1=%nr%
goto :eof

版本2:

因为:random是一个很好的独立子程序,如果需要,您可以轻松更改它。例如,如果1000到9999不够好,您可以获得0000到9999的范围,并通过将子例程替换为零来左键填充生成的数字:

:random
:: Version 2: Generates a random number between 0000 and 9999
setlocal
set /a nr=%random%*9999/32767
set nr=0000%nr%
set nr=%nr:~-4%
endlocal & set %1=%nr%

代码细分。

  • setlocal启动了一个新的本地环境。环境变量被复制到这个新环境中,但如果更改添加或删除它们,则不会影响此“本地”范围之外的环境变量。另请参阅 endlocal
  • ::rem用于评论
  • :random是一个标签。以冒号开头的标识符表示标签。标签可用于程序的控制流程。这个标签之后的代码我称之为子程序。您可以跳转到标签以执行子例程(调用)并从中返回(goto :eof)以继续正常执行。就像你在调用一个单独的批处理文件一样,只是它嵌入在同一个文件中。
  • call调用批处理文件或子例程。通过指定标签,您可以跳转到批处理文件的另一部分,但与goto不同,call允许您跳回到调用位置。
  • goto :eof跳转到脚本的末尾。如果使用call调用标签,则此命令将跳回到调用位置并从那里继续执行。所以它就像从函数中返回
  • code1到code5。我指定了我想要获得子例程结果的变量的名称。这样,我可以调用它五次来填充五个不同的变量。
  • endlocal结束以startlocal开头的本地范围。
  • endlocal & set serial=%serial%。这是一个技巧。本地范围已结束,但在结束之前(通过执行该行),命令解释程序解释整行,扩展变量。这允许您将外部(或全局)范围中的变量设置为在内部范围中创建的值。我基本上使用它来指定子例程的返回值,并从脚本中返回变量serial
  • 子程序中使用的
  • endlocal & set %1=%nr%。这将设置在调用的第一个参数中指定名称的变量。因此%1扩展为code1code2等。这样,子例程可以设置任何变量,而无需知道它正在设置哪个变量。
  • set /a设置变量,但允许使用简单的算术公式(计算)。这样,您可以计算1000到9999(版本1)或0到9999(版本2)之间的值。
  • 在版本2中,如果值较短,我会用零填充值。这分三步完成。首先生成数字,然后在它前面添加零,最后使用符号%nr:~-4%抓取最后四个字符。

如果这对你来说太复杂了,你可以复制公式本身并跳过所有其他的:

版本3:

@echo off
set /a code1=%random%*9999/32767
set code1=0000%code1%

set /a code2=%random%*9999/32767
set code2=0000%code2%

set /a code3=%random%*9999/32767
set code3=0000%code3%

set /a code4=%random%*9999/32767
set code4=0000%code4%

set /a code5=%random%*9999/32767
set code5=0000%code5%

set serial=%code1:~-4%-%code2:~-4%-%code3:~-4%-%code4:~-4%-%code5:~-4%
echo %serial%
pause

版本4: 非常非常简单的版本。 Jahwi建议使用模运算来限制数字,因此使用set /a nr=%random%%%10000会给出0到9999之间的数字。但是,除法并不是真的。由于你得到一个0到32767之间的随机数,只做这个模运算会导致0到2767之间的数字比2768和9999之间的数字更频繁。

如果这不打扰你,你可以使用这个方法,或者只是简单地截断4位数的值,这基本上具有相同的效果。下面的代码只是截断随机数,并确保它们用零填充,直到4的长度。这大约是它的短,但请记住,这些数字比那些数字更简单和平衡。版本1到3。

@echo off
set code1=0000%random%
set code2=0000%random%
set code3=0000%random%
set code4=0000%random%
set code5=0000%random%

set serial=%code1:~-4%-%code2:~-4%-%code3:~-4%-%code4:~-4%-%code5:~-4%
echo %serial%
pause

答案 1 :(得分:0)

问题是,您没有为随机输出设置限制。 修改后的代码:

@echo off 
:a
set /a no1=%random%%%10
set /a no2=%random%%%10
set /a no3=%random%%%10
set /a no4=%random%%%10
set /a no5=%random%%%10
set x=%no1%-%no2%-%no3%-%no4%-%no5%
echo %x% 
pause

注意%random %%% 9这告诉批处理程序每​​个生成的数字不得大于9.即随机数必须始终小于10.