Board logo

标题: [其他] 批处理怎样乱序排列字符串里的字符? [打印本页]

作者: bluewing009    时间: 2010-12-4 09:38     标题: 批处理怎样乱序排列字符串里的字符?

本帖最后由 pcl_test 于 2016-9-28 22:19 编辑

RT,对abcdefghijklmnopqrstuvwxyz进行乱序排列
我的思路:
取随机数,从字符串取一个,然后去掉这个已经取得的,再次随机取一个,再去掉.....循环至最后一个
以下是代码
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. set var_temp=abcdefghijklmnopqrstuvwxyz
  4. for /l %%i in (26,-1,1) do (
  5.     set /a pick=!random!%%%%i
  6.     call :1 !pick!
  7. )
  8. echo !var!
  9. pause
  10. :1
  11. set choose=!var_temp:~%1,1!
  12. set var=%var%%choose%
  13. call :2 !choose!
  14. goto :eof
  15. :2
  16. set var_temp=!var_temp:%1=!
  17. goto :eof
复制代码
问:  还有没有其他的快捷思路或方法?

[ 本帖最后由 bluewing009 于 2010-12-4 09:42 编辑 ]
作者: hanyeguxing    时间: 2010-12-4 09:52

  1. @echo off&Setlocal enabledelayedexpansion
  2. set t=abcdefghijklmnopqrstuvwxyz
  3. for /l %%a in (0,1,25) do set #!random!!random!!random!=!t:~%%a,1!
  4. for /f "tokens=2 delims==" %%a in ('set #') do set v=!v!%%a
  5. echo %v%&pause
复制代码
使用连续多个!random!是为了降低变量名重复几率的

[ 本帖最后由 hanyeguxing 于 2010-12-4 10:31 编辑 ]
作者: hanyeguxing    时间: 2010-12-4 10:16

如果担心%random%有重复,则:
  1. @echo off&Setlocal enabledelayedexpansion
  2. set t=abcdefghijklmnopqrstuvwxyz
  3. :n
  4. set/a r=%random%%%26
  5. if "!#%r%!"=="" (set #%r%==) else goto:n
  6. set/a n+=1&set v=!v!!t:~%r%,1!
  7. if %n% lss 26 goto:n
  8. echo %v%&pause
复制代码

[ 本帖最后由 hanyeguxing 于 2010-12-4 10:17 编辑 ]
作者: vsbat    时间: 2010-12-4 11:41

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set var=abcdefghijklmnopqrstuvwxyz
  4. set x=26
  5. set c=0
  6. :Go
  7. set /a num=%random%%%%x%
  8. set t=!var:~%num%,1!
  9. set result=%result%%t%
  10. set var=!var:%t%=!
  11. set /a c+=1
  12. set /a x-=1
  13. if %c% == 26 (goto :End) else (goto :Go)
  14. :End
  15. echo %result%
  16. pause
复制代码

作者: hanyeguxing    时间: 2010-12-4 11:57

  1. @echo off&Setlocal enabledelayedexpansion
  2. set v=abcdefghijklmnopqrstuvwxyz
  3. for /l %%a in (26,-1,1) do (
  4.     set/a n=!random!%%%%a
  5.     for %%b in (!n!) do set t=!v:~%%b,1!
  6.     for %%b in (!t!) do set v=!v:%%b=!&set e=!e!%%b
  7. )
  8. echo %e%&pause
复制代码
或:
  1. @echo off&Setlocal enabledelayedexpansion
  2. set v=abcdefghijklmnopqrstuvwxyz
  3. for /l %%a in (26,-1,1) do (
  4.     set/a n=!random!%%%%a
  5.     call set t=%%v:~!n!,1%%
  6.     call set v=%%v:!t!=%%
  7.     set e=!e!!t!
  8. )
  9. echo %e%&pause
复制代码

[ 本帖最后由 hanyeguxing 于 2010-12-4 12:05 编辑 ]
作者: cutebe    时间: 2010-12-4 15:49

  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. set ala=abcdefghijklmnopqrstuvwxyz
  4. :lp
  5. set/an=%random%%%26,m=n-1
  6. if %n%==0 goto :lp
  7. set ala=!ala:~%n%!!ala:~%m%,1!!ala:~,%m%!
  8. set/ax+=1
  9. if %x% leq 99 goto :lp
  10. echo %ala%
  11. pause
复制代码





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2