大家知道(不知道的现在应该知道了)random是批处理中用来获取随机
数的唯一系统变量,它的随机取值范围是0和32767 之间的任意十进制整数。
不得不说这个random是非常强大的,但是我们今天在这里讨论的不是random
的实际应用(对此论坛已有技术贴进行论述),我们要讨论的是它的bug,
就是它那致命的bug!
我们先来看下面这个代码:
- @echo off
- echo %random%
- pause>nul
复制代码
将这段代码保存为test.bat,双击运行黑屏幕上会出现一个随机整数,
没问题呀!真的没问题吗?现在你将这个test.bat连续点击运行10次,记
得记住每次出现的值,你会发现出现的值一次比一次在递增,你们想一下
这是随机取值吗?于是,我又做了下面的测试:
- @echo off
- set /a n=%1+1
- echo %random%
- if %n% neq 11 call %0 %n%
- pause>nul
复制代码
这是用批来模拟连续10次双击运行test.bat,可是结果却是大不相
同,random又恢复正常了,对此我是没有想明白怎么回事。也许有人会
说可能在一次持续运行中random是会正常的(上面的批可以视为是一次
持续运行)。好的,我们再往下看:
- @echo off
- for /l %%a in (1,1,10) do echo %random%
- pause>nul
复制代码
- @echo off
- :lp
- set /a n+=1
- echo %random%
- if %n% neq 10 goto lp
- pause>nul
复制代码
同样是一个持续运行过程,用for循环就出现问题了,而goto循环是
正常的,不过我可以告诉大家for循环中的问题是可以解决的,如下:
- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (1,1,10) do echo !random!
- pause>nul
复制代码
如果有人说是cmd预处理机制做的怪,我也认为是的,但是我还是不
能明白,既然random是系统变量而且是随时改变值的系统变量,这个应
该是不关预处理机制的事的,同样可用下面的代码来小证一下:
- @echo off&setlocal enabledelayedexpansion
- echo !random!
- pause>nul
复制代码
同样将上面这段代码连续运行10次,这10次得出的随机值居然也是
一样在递增,如果是预处理机制在影响,那么这怎么解释呢?
也请大家都来就random的bug发表下自己的高见吧。 |