Board logo

标题: [其他] [分享]批处理生成横竖不重复的数字 [打印本页]

作者: terse    时间: 2008-8-13 00:14     标题: [分享]批处理生成横竖不重复的数字

随机数 9排 9行 无重复
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1 1 9) do call:lp %%i
  3.   for /l %%i in (1 1 9) do (
  4.     for /l %%j in (1 1 9) do set/p=!%%i%%j! <nul
  5.     echo.
  6.    )
  7. pause&exit
  8. :lp
  9. for /l %%i in (1 1 9) do set .!random!!random!!random!=%%i
  10.    for /f "tokens=1,2 delims==" %%i in ('set .') do set str=%%j !str!&set %%i=
  11.       for /l %%i in (1 1 9) do set %1%%i=
  12.       set var=%str%&set n=1
  13. :lp0
  14. for %%a in (!var!) do (
  15. if defined .%%a set var=!var:%%a=!&goto lp0
  16.     for /l %%i in (1 1 %1) do if %%a equ !%%i%n%! set var=!var:%%a=!&goto lp0
  17.         set %1!n!=%%a&set .%%a=a
  18.         if !n! lss 9 set/a n+=1&set var=!str:%%a=!&goto lp0
  19.         )
  20.         set str=&set n=
  21.         for /l %%i in (1 1 9) do set .%%i=
  22.         if "!%19!"=="" goto lp
复制代码

作者: 随风    时间: 2008-8-13 00:24

楼主的效率太低,
此题值得大家讨论讨论。。。
作者: terse    时间: 2008-8-13 01:03

是的 先前在联盟写了个 成功率不高
原来是少写一句   这个不过提高一下成功率
作者: 523066680    时间: 2008-8-13 08:57     标题: 这个是moniuming的解

  1. @echo off
  2. title 数字九宫格 Code By cn-dos moniuming
  3. Setlocal Enabledelayedexpansion
  4. for /l %%i in (1 1 9) do (set "bat=!bat! %%i")
  5. :begin
  6. echo.
  7. for /l %%i in (1 1 9) do (set "str%%i=%bat%")
  8. for /l %%a in (9 -1 1) do (call :loop1 %%a)
  9. echo.&pause&goto :begin
  10. :loop1
  11. if "%n%"=="9" (
  12.    set "n=0"&echo %var%&set "var="
  13.    for /l %%c in (1 1 9) do (set "%%c="&set "string%%c=")
  14.    goto :eof
  15. )
  16. set /a "n+=1"
  17. for /l %%f in (1 1 9) do (
  18.    if not defined string%%f (set "string%%f=!str%%f!")
  19. )
  20. :loop2
  21. set /a "ttl+=1"
  22. if "%ttl%"=="30" (
  23.    set "ttl=0"&set "var="&set "n=0"
  24.    for /l %%e in (1 1 9) do (set "%%e="&set "str%%e=!string%%e!")
  25.    goto :loop1
  26. )
  27. set /a "mdl=%random%%%%1+1"
  28. for /f "tokens=%mdl%" %%d in ("!str%n%!") do (
  29.    if defined %%d goto :loop2
  30.    set "ttl=0"
  31.    set "var=!var! %%d"
  32.    set "%%d=dos"
  33.    set "str%n%=!str%n%:%%d=!"
  34. )
  35. goto :loop1
复制代码

作者: 523066680    时间: 2008-8-13 20:37

……受之有愧啊,只是帮别人转,何必给我加分呢
作者: 随风    时间: 2008-8-15 18:13

效率不是问题。
  1. @echo off&setlocal enabledelayedexpansion
  2. set "sz=0123456789"
  3. for /l %%i in (0 1 9) do (
  4.    set var%%i=!sz:~1!!sz:~0,1!
  5.    set "sz=!var%%i!"
  6.    set ".!random!!random!!random!=%%i"
  7.    set "#!random!!random!!random!=%%i"
  8. )
  9. for /f "tokens=2 delims==" %%a in ('set .') do set var=!var! %%a
  10. for /l %%a in (0 1 9) do (
  11.    for %%i in (!var!) do set num%%a=!var%%a:~%%i,1! !num%%a!
  12. )
  13. for /f "tokens=2 delims==" %%a in ('set #') do echo !num%%a!
  14. pause
复制代码

作者: batman    时间: 2008-8-15 19:48

原帖由 随风 于 2008-8-15 18:13 发表
效率不是问题。
@echo off&setlocal enabledelayedexpansion
set "sz=0123456789"
for /l %%i in (0 1 9) do (
   set var%%i=!sz:~1!!sz:~0,1!
   set "sz=!var%%i!"
   set ".!random!!random!!random!=%%i" ...

好!!!充分利用random和set来进行乱序,但似乎可以减少一个乱序修改成如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "sz=0123456789"
  3. for /l %%i in (0 1 9) do (
  4.    set var%%i=!sz:~1!!sz:~0,1!
  5.    set "sz=!var%%i!"
  6.    set ".!random!!random!!random!=%%i"
  7. )
  8. for /f "tokens=2 delims==" %%a in ('set .') do set var=!var! %%a
  9. for /l %%a in (0 1 9) do (
  10.    for %%i in (!var!) do set num%%a=!var%%a:~%%i,1! !num%%a!
  11. )
  12. for /f "tokens=2 delims==" %%a in ('set .') do echo !num%%a!
  13. pause>nul
复制代码

作者: 随风    时间: 2008-8-15 20:00

7 楼
最开始也是这样,但发现仍有部分规律存在

[ 本帖最后由 随风 于 2008-8-15 20:03 编辑 ]
作者: more    时间: 2008-8-15 21:26

太精彩了,绝对要珍藏起来!!!
作者: 523066680    时间: 2008-8-16 17:58

cn-dos的17楼这个思路可行,而且效率也不错。看代码
思路来自:http://www.cn-dos.net/forum/view ... id=t37HXp#pid292578        17楼obsolete
以下代码还是可以精简的……
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set h1=123456789
  4. set h2=234567891
  5. set h3=345678912
  6. set h4=456789123
  7. set h5=567891234
  8. set h6=678912345
  9. set h7=789123456
  10. set h8=891234567
  11. set h9=912345678
  12. :a
  13. set /a a=0,b=0
  14.   :b
  15.   set /a a+=1
  16.      :b1
  17.      set n=%random:~-1%
  18.      if %n% equ 9 set n=8
  19.      if not defined Ex%n% (
  20.      for /l %%a in (1,1,9) do (call,set hang%%a=!hang%%a! %%h%%a:~!n!,1%%)
  21.      ) else (goto :b1)
  22.   set Ex%n%=ex
  23.   if %a% lss 9 goto :b
  24.   :c
  25.     set /a b+=1
  26.      :c1
  27.      set n=%random:~-1%
  28.      if %n% equ 0 set n=9
  29.      if not defined Ex2%n% (echo !hang%n%!) else (goto :c1)
  30.   set Ex2%n%=ex
  31.   if %b% lss 9 goto :c
  32. pause
  33. for /l %%a in (0,1,9) do (
  34. set Ex%%a=
  35. set Ex2%%a=
  36. set hang%%a=
  37. )
  38. goto :a
复制代码

[ 本帖最后由 523066680 于 2008-8-16 20:01 编辑 ]
作者: terse    时间: 2008-8-17 02:23

10楼和7楼有还原可能  是否前面可以再乱它一下
for /l %%i in (0 1 9) do set _!random!!random!!random!=%%i
   for /f "tokens=2 delims==" %%i in ('set _') do set sz=%%i!sz!
作者: 523066680    时间: 2008-8-17 06:24

告诉大家一件很牛逼的事情!
我第一次打开随风的代码  和第二次打开的时候一模一样!
后来试了几十次……都不一样了……
那天应该去买六合彩的……错过了……



额……仔细想下,关于还原可能,用我的知识算10楼方法的概率(10楼的是9X9的格)
我是先从横的打乱,可能的情况为n=9x8x7x6x5x4x3x2x1
再从竖打乱,可能的情况为m=9x8x7x6x5x4x3x2x1
总的可能情况为 n*m=131681894400
而我取得是random~-1   随机数的最后一个数,从随机性上说,应该已经够了……
我觉得不必再打乱,如果要碰上1234……那也是贼好的运气。该碰上的始终会碰上。


为此我想到一个题目---用批处理检测%ramdom%最后一个数,从0~9按顺序列出的概率
(只是想想……)

[ 本帖最后由 523066680 于 2008-8-17 06:40 编辑 ]
作者: more    时间: 2008-8-17 13:34

6楼和10楼的代码效率很高,但均可以找到规律,只有楼主和4楼的代码是真正的乱序,但却牺牲了效率,唉,真是难两全啊...
作者: terse    时间: 2008-8-17 14:02

原帖由 523066680 于 2008-8-17 06:24 发表
告诉大家一件很牛逼的事情!
我第一次打开随风的代码  和第二次打开的时候一模一样!
后来试了几十次……都不一样了……
那天应该去买六合彩的……错过了……



额……仔细想下,关于还原可能,用我的知识算 ...

我只是说下我的想法 你也只是谈一件很牛逼的事情
至于你第一次打开随风的代码  和第二次打开的时候一模一样!我想这个概率你真的可以买六合彩了
我把你的代码写到123.txt 然后一次SORT到456.txt 看看有规律否? 一次SORT总可以用吧
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set h1=123456789
  4. set h2=234567891
  5. set h3=345678912
  6. set h4=456789123
  7. set h5=567891234
  8. set h6=678912345
  9. set h7=789123456
  10. set h8=891234567
  11. set h9=912345678
  12. :a
  13. set /a a=0,b=0
  14.   :b
  15.   set /a a+=1
  16.      :b1
  17.      set n=%random:~-1%
  18.      if %n% equ 9 set n=8
  19.      if not defined Ex%n% (
  20.      for /l %%a in (1,1,9) do (call,set hang%%a=!hang%%a! %%h%%a:~!n!,1%%)
  21.      ) else (goto :b1)
  22.   set Ex%n%=ex
  23.   if %a% lss 9 goto :b
  24.   :c
  25.     set /a b+=1
  26.      :c1
  27.      set n=%random:~-1%
  28.      if %n% equ 0 set n=9
  29.      if not defined Ex2%n% (>>123.txt echo !hang%n%!) else (goto :c1)
  30.   set Ex2%n%=ex
  31.   if %b% lss 9 goto :c
  32. pause
  33. sort <123.txt >456.txt
  34. for /l %%a in (0,1,9) do (
  35. set Ex%%a=
  36. set Ex2%%a=
  37. set hang%%a=
  38. )
  39. goto :a
复制代码

作者: 523066680    时间: 2008-8-17 21:29

好,那我就出新的对策,看代码。横竖打乱后,再多次随机调换数字。
  1. @echo off
  2. title made by cn-dos and bathome - 523066680
  3. setlocal enabledelayedexpansion
  4. :start
  5. set h1=123456789
  6. set h2=234567891
  7. set h3=345678912
  8. set h4=456789123
  9. set h5=567891234
  10. set h6=678912345
  11. set h7=789123456
  12. set h8=891234567
  13. set h9=912345678
  14. for /l %%a in (0,1,9) do (
  15. set Ex%%a=
  16. set Ex2%%a=
  17. set hang%%a=
  18. )
  19. set /a a=0,b=0,c=0
  20. ::a ---把列打乱
  21.   :a
  22.   set /a a+=1
  23.      :a-1
  24.      set n=%random:~-1%
  25.      if %n% equ 9 set n=8
  26.      if not defined Ex%n% (
  27.      for /l %%a in (1,1,9) do (call,set hang%%a=!hang%%a! %%h%%a:~!n!,1%%)
  28.      ) else (goto :a-1)
  29.   set Ex%n%=ex
  30.   if %a% lss 9 goto :a
  31. ::b ---把行打乱
  32.   :b
  33.     set /a b+=1
  34.      :b-1
  35.      set n=%random:~-1%
  36.      if %n% equ 0 set n=9
  37.      if not defined Ex2%n% (set h%b%=!hang%n%!) else (goto :b-1)
  38.   set Ex2%n%=ex
  39.   if %b% lss 9 goto :b
  40. ::c ---随机调换数字
  41.   :c
  42.     set /a c+=1
  43.      :c-1
  44.      set n1=!random:~-1!
  45.      set n2=!random:~-1!
  46.      if %n1% equ %n2% goto :c-1
  47.      if %n1% equ 0 set n1=1
  48.      if %n2% equ 0 set n2=9
  49.      for /l %%a in (1,1,9) do (
  50.            set h%%a=!h%%a:%n1%=n!
  51.            set h%%a=!h%%a:%n2%=%n1%!
  52.            set h%%a=!h%%a:n=%n2%!
  53.            )
  54.      if %c% lss 8 goto :c
  55. for /l %%a in (1,1,9) do echo !h%%a!
  56. pause
  57. goto :start
复制代码
但也出现
8
  8
    8
这样的情况,不过大家的代码偶尔也出现这种情况 好像很难避免了

[ 本帖最后由 523066680 于 2008-8-18 08:04 编辑 ]
作者: terse    时间: 2008-8-18 10:52

原帖由 523066680 于 2008-8-17 21:29 发表
好,那我就出新的对策,看代码。横竖打乱后,再多次随机调换数字。@echo off
title made by cn-dos and bathome - 523066680
setlocal enabledelayedexpansion
:start
set h1=123456789
set h2=234567891
set  ...

我11楼的看法就是在开始打乱行  我想效果一样
下面是随风的代码  我在前面先乱它一下
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (0 1 9) do set _!random!!random!!random!=%%i
  3.    for /f "tokens=2 delims==" %%i in ('set _') do set sz=%%i!sz!
  4. for /l %%i in (0 1 9) do (
  5.    set var%%i=!sz:~1!!sz:~0,1!
  6.    set "sz=!var%%i!"
  7.    set ".!random!!random!!random!=%%i"
  8.    set "#!random!!random!!random!=%%i"
  9. )
  10. for /f "tokens=2 delims==" %%a in ('set .') do set var=!var! %%a
  11. for /l %%a in (0 1 9) do (
  12.    for %%i in (!var!) do set num%%a=!var%%a:~%%i,1! !num%%a!
  13. )
  14. for /f "tokens=2 delims==" %%a in ('set #') do echo !num%%a!
  15. pause
复制代码





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