我的一个朋友让我制作了一个程序,它会像时尚一样以矩阵形式打印一串随机的1和0。我同意并成功地编写了一个具有所需输出的批处理程序,但它运行得有点慢,我想知道是否有办法让它更有效率
set count=0
:loopassign
if %count%==80 goto show
set/a count=%count%+1
set/a value=%random% %% 2
set number%count%=%value%
goto loopassign
:show
echo { %number1%%number2%%number3%%number4%%number5%%number6%%number7%%number8%%number9%%number10%%number11%%number12%%number13%%number14%%number15%%number16%%number17%%number18%%number19%%number20%%number21%%number23%%number24%%number25%%number26%%number27%%number28%%number29%%number30%%number31%%number32%%number33%%number43%%number44%%number45%%number46%%number47%%number48%%number49%%number50%%number51%%number52%%number53%%number54%%number55%%number56%%number57%%number58%%number59%%number60%%number61%%number62%%number63%%number64%%number65%%number66%%number67%%number68%%number69%%number70%%number71%%number72%%number73%%number74%%number75%%number76%%number77%%number78%%number79%%number80% }
set count=0
goto loopassign
答案 0 :(得分:1)
主要耗时部分是goto loopassign
这可以用FOR / L循环代替。
循环优于goto,因为在搜索标签时不再需要扫描整个文件。
并且for-block中的代码被缓存并且只需解析一次,因此执行速度要快得多。
对于单个字符,我使用单行变量而不是80个变量仅用于可维护性。
@echo off
setlocal enableDelayedExpansion
set count=0
:loopassign
set "line="
for /L %%n in (1,1,80) do (
set /a "value=!random! & 1"
set "line=!line!!value!"
)
:show
echo { !line! }
goto loopassign
更多改进的速度变体
你可以通过一个简单的技巧轻松加速它,在每个循环中生成四个而不是一个字符,因此一行只需要20个循环。
for /L %%n in (1,1,20) do (
set /a "n=!random! & 15,m=10000+(n&8)*125+(n&4)*25+(n&2)*5+(n & 1)"
set "ln=!ln!!m:~-4!"
)
这似乎快了三倍
答案 1 :(得分:1)
你应该了解
FOR循环:从命令提示符处键入HELP FOR
。特别是,您需要FOR / L选项
延迟展开:从命令提示符处键入HELP SET
。关于延迟扩张的部分大约是帮助的一半。
这是一个使用2个FOR / L循环的解决方案。外循环是无限的,因为它永远不会增加计数器。
@echo off
setlocal enableDelayedExpansion
for /l %%Z in (0 0 1) do (
set "ln="
for /l %%N in (1 1 80) do (
set /a "n=!random! %% 2"
set "ln=!ln!!n!"
)
echo { !ln! }
)
exit /b
答案 2 :(得分:1)
我喜欢速度测试程序!我认为下面的矿井会更快......
@echo off
setlocal EnableDelayedExpansion
rem Create a Decimal-to-Binary conversion table for values from 0 to 15
set dec=0
for %%n in (0000 0001 0010 0011 0100 0101 0110 0111
1000 1001 1010 1011 1100 1101 1110 1111 ) do (
set bin[!dec!]=%%n
set /A dec+=1
)
rem Repeat the loop 5 times per line
set line=
for /L %%n in (1,1,5) do (
rem Generate 4 groups of 4 bits per cycle
set /A "G1=(n=!random!)&15, G2=(n>>=(G1&3)+1)&15, G3=(n>>=4)&15, G4=(n>>4)&15"
for /F "tokens=1-4" %%a in ("!G1! !G2! !G3! !G4!") do (
set line=!line!!bin[%%a]!!bin[%%b]!!bin[%%c]!!bin[%%d]!
)
)
echo { %line%}
安东尼奥
编辑:我略微修改了表达式,以避免在80位二进制数字行的5个固定位置处出现零。