【问题标题】:How can I generate a four-digit random number?如何生成四位随机数?
【发布时间】:2015-07-28 21:01:13
【问题描述】:

我正在尝试创建一个批处理文件,该文件以 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

【问题讨论】:

  • 这段代码目前做了什么?您的文字表明它目前生成一个由 5 位数字组成的序列号,对吗?
  • @Adam 链接问题中的第一个答案告诉你如何做你想做的事
  • @HoboSapiens 我以前读过,试过了,没用....
  • @Adam 那么你应该在你的问题中指出这一点,并解释你尝试过的可能重复的问题。

标签: batch-file random cmd


【解决方案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
  • :: as rem 用于 cmets
  • :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

【讨论】:

  • 对不起, :: 就像 rem 函数? :random 就像 %random%?从来没有见过这样的东西:3,setlocal 是什么?
  • 它工作了,但它太复杂了,因为我不明白我上面阐述的一些功能
  • :: 和 rem 开始评论。 :random 是一个标签。 %random% 是一个变量。 setlocal 本地化变量,使它们是独占的。
  • 也许你不需要全部,但我认为一些细节(一些 cmets 和 setlocal 的使用是锦上添花,使它成为一个整洁的脚本。我'我们添加了一个几乎逐步的描述来告诉你它的作用。
  • @AdamTheCarpenter。请在此处提问之前获得最低限度的知识。看来您不仅对 %random% 有问题,而且对批处理文件也有一般问题
【解决方案2】:

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

@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。

【讨论】:

  • 不错的解决方案,如果您使用10000 而不是10,您将获得一个四位数字:%random%%%10000。但是,划分并不均匀。由于您得到一个介于 0 和 32767 之间的随机数,因此仅执行此模运算将导致 0 和 2767 之间的数字比 2768 和 9999 之间的数字更频繁地出现。此外,这些数字不会被填充。
  • @Jahwi 谢谢你^_^ 我希望我有足够的声望来支持你,看来我需要 15 声望,干得好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
相关资源
最近更新 更多