标题: [其他] [分享]批处理生成横竖不重复的数字 [打印本页]
作者: terse 时间: 2008-8-13 00:14 标题: [分享]批处理生成横竖不重复的数字
随机数 9排 9行 无重复
- @echo off&setlocal enabledelayedexpansion
- for /l %%i in (1 1 9) do call:lp %%i
- for /l %%i in (1 1 9) do (
- for /l %%j in (1 1 9) do set/p=!%%i%%j! <nul
- echo.
- )
- pause&exit
- :lp
- for /l %%i in (1 1 9) do set .!random!!random!!random!=%%i
- for /f "tokens=1,2 delims==" %%i in ('set .') do set str=%%j !str!&set %%i=
- for /l %%i in (1 1 9) do set %1%%i=
- set var=%str%&set n=1
- :lp0
- for %%a in (!var!) do (
- if defined .%%a set var=!var:%%a=!&goto lp0
- for /l %%i in (1 1 %1) do if %%a equ !%%i%n%! set var=!var:%%a=!&goto lp0
- set %1!n!=%%a&set .%%a=a
- if !n! lss 9 set/a n+=1&set var=!str:%%a=!&goto lp0
- )
- set str=&set n=
- for /l %%i in (1 1 9) do set .%%i=
- if "!%19!"=="" goto lp
复制代码
作者: 随风 时间: 2008-8-13 00:24
楼主的效率太低,
此题值得大家讨论讨论。。。
作者: terse 时间: 2008-8-13 01:03
是的 先前在联盟写了个 成功率不高
原来是少写一句 这个不过提高一下成功率
作者: 523066680 时间: 2008-8-13 08:57 标题: 这个是moniuming的解
- @echo off
- title 数字九宫格 Code By cn-dos moniuming
- Setlocal Enabledelayedexpansion
- for /l %%i in (1 1 9) do (set "bat=!bat! %%i")
- :begin
- echo.
- for /l %%i in (1 1 9) do (set "str%%i=%bat%")
- for /l %%a in (9 -1 1) do (call :loop1 %%a)
- echo.&pause&goto :begin
- :loop1
- if "%n%"=="9" (
- set "n=0"&echo %var%&set "var="
- for /l %%c in (1 1 9) do (set "%%c="&set "string%%c=")
- goto :eof
- )
- set /a "n+=1"
- for /l %%f in (1 1 9) do (
- if not defined string%%f (set "string%%f=!str%%f!")
- )
- :loop2
- set /a "ttl+=1"
- if "%ttl%"=="30" (
- set "ttl=0"&set "var="&set "n=0"
- for /l %%e in (1 1 9) do (set "%%e="&set "str%%e=!string%%e!")
- goto :loop1
- )
- set /a "mdl=%random%%%%1+1"
- for /f "tokens=%mdl%" %%d in ("!str%n%!") do (
- if defined %%d goto :loop2
- set "ttl=0"
- set "var=!var! %%d"
- set "%%d=dos"
- set "str%n%=!str%n%:%%d=!"
- )
- goto :loop1
复制代码
作者: 523066680 时间: 2008-8-13 20:37
……受之有愧啊,只是帮别人转,何必给我加分呢
作者: 随风 时间: 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"
- set "#!random!!random!!random!=%%i"
- )
- for /f "tokens=2 delims==" %%a in ('set .') do set var=!var! %%a
- for /l %%a in (0 1 9) do (
- for %%i in (!var!) do set num%%a=!var%%a:~%%i,1! !num%%a!
- )
- for /f "tokens=2 delims==" %%a in ('set #') do echo !num%%a!
- 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来进行乱序,但似乎可以减少一个乱序修改成如下:- @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"
- )
- for /f "tokens=2 delims==" %%a in ('set .') do set var=!var! %%a
- for /l %%a in (0 1 9) do (
- for %%i in (!var!) do set num%%a=!var%%a:~%%i,1! !num%%a!
- )
- for /f "tokens=2 delims==" %%a in ('set .') do echo !num%%a!
- 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
以下代码还是可以精简的……- @echo off
- setlocal enabledelayedexpansion
- set h1=123456789
- set h2=234567891
- set h3=345678912
- set h4=456789123
- set h5=567891234
- set h6=678912345
- set h7=789123456
- set h8=891234567
- set h9=912345678
- :a
- set /a a=0,b=0
- :b
- set /a a+=1
- :b1
- set n=%random:~-1%
- if %n% equ 9 set n=8
- if not defined Ex%n% (
- for /l %%a in (1,1,9) do (call,set hang%%a=!hang%%a! %%h%%a:~!n!,1%%)
- ) else (goto :b1)
- set Ex%n%=ex
- if %a% lss 9 goto :b
- :c
- set /a b+=1
- :c1
- set n=%random:~-1%
- if %n% equ 0 set n=9
- if not defined Ex2%n% (echo !hang%n%!) else (goto :c1)
- set Ex2%n%=ex
- if %b% lss 9 goto :c
- pause
- for /l %%a in (0,1,9) do (
- set Ex%%a=
- set Ex2%%a=
- set hang%%a=
- )
- 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总可以用吧
- @echo off
- setlocal enabledelayedexpansion
- set h1=123456789
- set h2=234567891
- set h3=345678912
- set h4=456789123
- set h5=567891234
- set h6=678912345
- set h7=789123456
- set h8=891234567
- set h9=912345678
- :a
- set /a a=0,b=0
- :b
- set /a a+=1
- :b1
- set n=%random:~-1%
- if %n% equ 9 set n=8
- if not defined Ex%n% (
- for /l %%a in (1,1,9) do (call,set hang%%a=!hang%%a! %%h%%a:~!n!,1%%)
- ) else (goto :b1)
- set Ex%n%=ex
- if %a% lss 9 goto :b
- :c
- set /a b+=1
- :c1
- set n=%random:~-1%
- if %n% equ 0 set n=9
- if not defined Ex2%n% (>>123.txt echo !hang%n%!) else (goto :c1)
- set Ex2%n%=ex
- if %b% lss 9 goto :c
- pause
- sort <123.txt >456.txt
- for /l %%a in (0,1,9) do (
- set Ex%%a=
- set Ex2%%a=
- set hang%%a=
- )
- goto :a
复制代码
作者: 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 h3=345678912
- set h4=456789123
- set h5=567891234
- set h6=678912345
- set h7=789123456
- set h8=891234567
- set h9=912345678
-
- for /l %%a in (0,1,9) do (
- set Ex%%a=
- set Ex2%%a=
- set hang%%a=
- )
-
- set /a a=0,b=0,c=0
- ::a ---把列打乱
- :a
- set /a a+=1
- :a-1
- set n=%random:~-1%
- if %n% equ 9 set n=8
- if not defined Ex%n% (
- for /l %%a in (1,1,9) do (call,set hang%%a=!hang%%a! %%h%%a:~!n!,1%%)
- ) else (goto :a-1)
- set Ex%n%=ex
- if %a% lss 9 goto :a
- ::b ---把行打乱
- :b
- set /a b+=1
- :b-1
- set n=%random:~-1%
- if %n% equ 0 set n=9
- if not defined Ex2%n% (set h%b%=!hang%n%!) else (goto :b-1)
- set Ex2%n%=ex
- if %b% lss 9 goto :b
- ::c ---随机调换数字
- :c
- set /a c+=1
- :c-1
- set n1=!random:~-1!
- set n2=!random:~-1!
- if %n1% equ %n2% goto :c-1
- if %n1% equ 0 set n1=1
- if %n2% equ 0 set n2=9
- for /l %%a in (1,1,9) do (
- set h%%a=!h%%a:%n1%=n!
- set h%%a=!h%%a:%n2%=%n1%!
- set h%%a=!h%%a:n=%n2%!
- )
- if %c% lss 8 goto :c
- for /l %%a in (1,1,9) do echo !h%%a!
- pause
- 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楼的看法就是在开始打乱行 我想效果一样
下面是随风的代码 我在前面先乱它一下
- @echo off&setlocal enabledelayedexpansion
- 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!
- 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"
- set "#!random!!random!!random!=%%i"
- )
- for /f "tokens=2 delims==" %%a in ('set .') do set var=!var! %%a
- for /l %%a in (0 1 9) do (
- for %%i in (!var!) do set num%%a=!var%%a:~%%i,1! !num%%a!
- )
- for /f "tokens=2 delims==" %%a in ('set #') do echo !num%%a!
- pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |