2013-02-12 3 views
1

Мой друг попросил меня сделать программу, которая будет печатать строку случайных 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 

ответ

1

Основной трудоёмкой частью является goto loopassign.
Это может быть заменено петлей FOR/L.

Петля лучше, чем goto, так как больше нет необходимости сканировать полный файл во время поиска метки.
И код внутри блока блокируется и только раз обрабатывается, поэтому выполнение выполняется намного быстрее.

Это то, что я использую переменную одной строки вместо 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!" 
) 

Это, кажется, в три раза быстрее

+0

+1, Вы избили меня до этого, но я отправил практически одно и то же в любом случае с внешней бесконечной петлей FOR. – dbenham

+0

+1 К тому же внешняя петля не заметно улучшает скорость, но технику полубайка в три раза быстрее :-) – jeb

+0

ooh - это противно. Мне это нравится :) Некоторое время я думал, что вы можете сделать до 9 цифр за цикл, но потом я вспомнил '% random%' maxes на 32767. Почему '& 15'? Это кажется ненужным. – dbenham

1

Вы должны узнать о

  • ДЛЯ петель: Типа HELP 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 
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%} 

Антонио

EDIT: я слегка изменил выражение, чтобы избежать нули в 5 фиксированных позиций в строке 80 двоичных цифр.

+0

Ничего, но я полагаю, что старший бит всегда равен 0, так как% random% использует только 15 бит – jeb

+0

@jeb: Ой, вы правы, jeb! Это дает нули в 5 фиксированных положениях в 80 двоичных разрядах. Я исправил эту проблему небольшим трюком ;-) – Aacini