标题: 批处理产生四个四位不重复的随机数 [打印本页]
作者: youxi01 时间: 2008-1-3 23:19 标题: 批处理产生四个四位不重复的随机数
要求:
1、随机数的位数为4位(首位不能为0),且随机数由四个不重复的数字组成;
2、随机数之间不能重复
作者: zhangxiaopeng 时间: 2008-4-3 23:30
管理员也不公布一下答案呀。。。。
作者: 随风 时间: 2008-4-4 00:28
- @echo off
- set ci=4
- :start
- set /a w=%random%%%9+1,y=9
- set "var=0 1 2 3 4 5 6 7 8 9"
- call set "var=%%var:%w%=%%"
- for /l %%a in (1 1 3) do call :loop
- if not defined _%w% (
- set _%w%=a
- echo %w%
- set /a ci-=1
- )
- if %ci% neq 0 goto start
- echo\&pause&exit
- :loop
- set /a n=%random%%%%y%+1
- for /f "tokens=%n%" %%a in ("%var%") do set "m=%%a"
- set /a "y-=1"
- set "w=%w%%m%"
- call set "var=%%var:%m%=%%"
- goto :eof
复制代码
作者: zhangxiaopeng 时间: 2008-4-4 10:53
哇!昨天刚回复完,今天就有了,真不错。。不像一般的论坛。里面产生随机数那一行,w=%random%%%9+1,y=9 后面三个%能解释是什么意思么?
作者: youxi01 时间: 2008-4-4 11:13 标题: 回复 4楼 的帖子
这个代码他自己解释是最清楚的,呵呵,旁人还是不说了/
作者: youxi01 时间: 2008-4-4 11:13 标题: 回复 3楼 的帖子
兄的代码是不是人为的复杂化了?
作者: 随风 时间: 2008-4-4 12:54 标题: 回复 6楼 的帖子
你觉得是人为的复杂了?
我似乎精简不出来了。代码最主要的是想考虑效率问题,避免反复 goto
回 4 楼
set /a w=%random%%%9+1,y=9
可以看成
set /a w=%random%%%9+1
set /a y=9
set /a w=%random%%%9+1 %rqndom% 是个随机数 %% 代表取余操作。9+1 代表取的数底数为 1 范围是 9
作者: 小竹 时间: 2008-4-4 14:18
- @echo off
- setlocal enabledelayedexpansion
- set var=123456789
- set /a h1=%random%%%9+1
- set var=!var:%h1%=0!
- for /l %%i in (9,-1,7) do (
- set /a temp=!random!%%%%i
- call set h%%i=%%var:~!temp!,1%%
- call set var=%%var:!h%%i!=%%
- )
- echo %h1%%h9%%h8%%h7%
- pause
复制代码
作者: 随风 时间: 2008-4-4 14:46
思路很巧啊
作者: youxi01 时间: 2008-4-4 14:47 标题: 回复 8楼 的帖子
似乎只产生一个随机数
对于多个随机数,没有进行重复性判断(尽管这种几率很小)
作者: youxi01 时间: 2008-4-4 15:14
来一段“无赖”代码,通过for中循环值调整随机度。- @echo off
- setlocal enabledelayedexpansion
- set /a str=123456789
- for /l %%i in (1 1 10) do (
- set /a num=!random! %% 9+1
- call set str=%%str:!num!=%%!num!
- )
- echo !str:~2,4!
- pause
复制代码
作者: 小竹 时间: 2008-4-4 16:39 标题: 回复 11楼 的帖子
首位不能为0,但其它位可以为0。
作者: 梦想种子 时间: 2008-4-4 20:41
来个思路一般的:- @echo off
- :loop
- setlocal enabledelayedexpansion
- :num
- set /a t=!random!%%10
- if defined %t% goto num
- set %t%=ok
- set n=%n%%t%
- if "%n:~3%" == "" goto num
- if %n% lss 1000 (endlocal&goto loop)
- echo %n%
- pause
复制代码
再来个效率超低的:- @echo off
- :loop
- setlocal enabledelayedexpansion
- for /l %%i in (0,1,9) do set +!random!=%%i
- for /f "skip=6 delims=" %%j in ('set +^|sort') do (
- set t=%%j
- set a=!a!!t:~-1!
- )
- if !a! lss 1000 (endlocal&goto loop)
- echo !a!
- pause
复制代码
作者: sjzong 时间: 2009-4-25 15:38 标题: 我也试试
请问楼主:是产生一个四位数都不重复的数,还是产生四个四位数都不重复的数??
思路:随机取出该数的千、百、十、个位的数字,然后判断该数是否跟前面取的数重复;还要判断是否已经取满四个数- @echo off
- setlocal enabledelayedexpansion
- set str=0123456789
- :main
- cls
- set var=
- :a
- set s1=!str:0=!
- set/a num=%random%%%9
- set num1=!s1:~%num%,1!
- set s2=!str:%num1%=!
- set/a num=%random%%%9
- set num2=!s2:~%num%,1!
- set s3=!s2:%num2%=!
- set/a num=%random%%%8
- set num3=!s3:~%num%,1!
- set s4=!s3:%num3%=!
- set/a num=%random%%%7
- set num4=!s4:~%num%,1!
- set num=!num1!!num2!!num3!!num4!
- set/a n=0
- for %%a in (!var!) do (
- set/a n+=1
- if %%a equ !num! goto :a
- )
- if !n!==4 (echo !var!&pause>nul&goto main) else (set var=!var! !num!&goto :a)
复制代码
[ 本帖最后由 sjzong 于 2009-4-25 15:55 编辑 ]
作者: inittab 时间: 2009-4-25 17:36
我也来一个吧。能生成一批四位不重复的随机数:- @echo off&setlocal enabledelayedexpansion
- ::生成四位的随机数100个
- for /l %%i in (1,1,100) do (set/a #%%i=!random!%%9000+1000)
- ::过滤掉有重复数字的随机数
- for /l %%i in (0,1,100) do (
- for /l %%j in (0,1,9) do (
- set ss=!#%%i:%%j=!
- if !ss! lss 100 (set "#%%i=")
- )
- )
- for /f "tokens=2 delims=#=" %%i in ('set #') do echo %%i
-
- pause
复制代码
作者: 随风 时间: 2009-4-25 21:44 标题: 回复 15楼 的帖子
功力不错啊,学什么的。
赞!
作者: defanive 时间: 2009-4-25 21:49
15L的代码强。。。
不过能保证100个数以内肯定能生成么。。。
作者: sjzong 时间: 2009-4-26 05:17 标题: 回 15 楼的
15楼的思路的确很有新意!
但是我有两个疑问:
1、如果题目假设成求出全部四位不重复的四位数时,那循环次数是非常多了,速度就慢多了,因为1000~9999就有9000个,然后每一个再来删除重复字符(0~9共10),那就要运行9000*10次数!
换成另一种思路:先取千位(千位为10个数字扣除0,共9个),再取百位(百位为10个数字扣除千位的数字,共9个),再取十位(十位为10个数字扣除千位、百位两个,共8个),最后取个位(个位为10个数字扣除千位、百位、十位三个,共7个),利用排列组合,列出所有的数需要运行9*9*8*7=4536次。
那两种思路的效率高呢??? 希望楼主按你的思路写出可以列出四位不重复的四位数代码,然后跟下面代码对比一下,看看速度怎么样?
- @echo off
- setlocal enabledelayedexpansion
- set str=0 1 2 3 4 5 6 7 8 9
- set s1=!str:0=!
- for %%a in (!s1!) do (
- set s2=!str:%%a=!
- for %%b in (!s2!) do (
- set s3=!s2:%%b=!
- for %%c in (!s3!) do (
- set s4=!s3:%%c=!
- for %%d in (!s4!) do (
- set/a num+=1
- echo %%a%%b%%c%%d
- ))))
- echo !num!
- pause
复制代码
2、题目所提出的数字要求是随机数,按照15楼的方法时就难免会出现重复的数,就是第一次取随机数1234,有可能也取1234,虽然这种概率很小的!但毕竟存在。
作者: inittab 时间: 2009-4-26 16:59
如果按顺序排列。这个题目基本上没有难度了。(问题变成了:找出10000以内没有重复数字的四位数)
题目要求是, 生成四个随机的,没有重复数字的四位随机数
15的代码还存在相同数字的可能性。
有更好的改进代码,请跟进
[ 本帖最后由 inittab 于 2009-4-26 17:26 编辑 ]
作者: wangqi0077 时间: 2010-9-10 14:34
- @echo off
- :start
- set /a a=%random%%%10
- set /a b=%random%%%10
- set /a c=%random%%%10
- set /a d=%random%%%10
- echo %a%
- echo %b%
- echo %c%
- echo %d%
- if %a% neq 0 (
- if %a% neq %b% (
- if %a% neq %b% (
- if %a% neq %c% (
- if %a% neq %d% (
- if %b% neq %c% (
- if %b% neq %d% (
- if %c% neq %d% (echo %a%%b%%c%%d%) else goto start
- ) else goto start
- ) else goto start
- ) else goto start
- ) else goto start
- ) else goto start
- ) else goto start
- ) else goto start
- pause
- goto start
- pause
复制代码
水平有限..全用IF来弄的.
能问问高手.除中间的goto start 外,其他除了最后一个.中间的可以不要吗???自己都弄晕了.
[ 本帖最后由 wangqi0077 于 2010-9-10 14:53 编辑 ]
作者: wc726842270 时间: 2010-9-11 21:46
- @echo off
- %random%
- set a=%random%
- if %a% gtr 999 goto 2
- :2
- if %a% lss 10000 (echo %a% >>a.txt) else goto 3
- :3
- call a.bat
复制代码
作者: wc726842270 时间: 2010-9-11 21:48
我将BAT文件保存为a.bat 了.忘说了
作者: lvsehuaxue 时间: 2010-9-27 20:05 标题: 请高手判断是对还是错?
- @echo off
- set /a m+=1
- :loop
- set /a n+=1
- set /a v%n%=%random%%%9000+1000
- call set m%n%=%%v%n%%%
- if %n% lss 4 goto loop
- if %m1% neq %m2% (if %m2% neq %m3% (if %m3% neq %m4% echo %m1% %m2% %m3% %m4%))
- pause
复制代码
作者: lvsehuaxue 时间: 2010-9-27 20:09 标题: 23楼没说清楚
有的代码写出之后,我可以自己想办法验证。23楼的代码写出之后,我没法验证是对还是错(我找不出验证的办法),所以,请高手判断一下对错。再次感谢!
作者: lvsehuaxue 时间: 2010-9-27 20:12 标题: 23楼代码发错了,改正如下
- @echo off
- :loop
- set /a n+=1
- set /a v%n%=%random%%%9000+1000
- call set m%n%=%%v%n%%%
- if %n% lss 4 goto loop
- if %m1% neq %m2% (if %m2% neq %m3% (if %m3% neq %m4% echo %m1% %m2% %m3% %m4%))
- pause
复制代码
作者: 523066680 时间: 2010-9-27 21:12
擦啊……都这么精简
粗也上了- @echo off
- setlocal enabledelayedexpansion
- set /a mi=0
- :main
- for /l %%a in (0,1,9) do (set arr[%%a]=%%a)
- set /a i=0,num=%random% %% 9+1
- set /a arr[%num%]=arr[9]
- :next
- set /a i+=1,rnd=%random% %% (10-i),last=9-i
- set /a rand=!arr[%rnd%]!,num=num*10+rand,arr[%rnd%]=arr[%last%]
- if %i% lss 3 goto :next
- if defined number[%num%] (goto :main) else (
- set /a number[%num%]=1,mi+=1
- echo %num%
- )
- if %mi% lss 4 goto :main
- pause
复制代码
[ 本帖最后由 523066680 于 2010-9-28 15:08 编辑 ]
作者: netbenton 时间: 2010-9-27 21:44
炒冷饭呀~~~
我也来个,一次搞得一百个。
不够么!!自己把100改大点。。。
- @echo off&setlocal enabledelayedexpansion
- for /l %%i in (0,1,9) do set ms=!ms!%%i
-
- :lp
- for /l %%i in (1,1,100) do (
- set ns=!ms!
- set n=9
- set/a v=!random!%%9+1
- for %%b in (!v!) do set s=!ns:~%%b,1!
-
- for /l %%a in (1,1,3) do (
- for %%b in ("!s:~-1!") do set ns=!ns:%%~b=!
- set /a v=!random!%%n,n-=1
- for %%b in (!v!) do set s=!s!!ns:~%%b,1!
- )
- echo !s!
- )
- pause
- goto :lp
复制代码
作者: 523066680 时间: 2010-9-27 21:56 标题: 回复 27楼 的帖子
刚刚想了一下 , inittab 的剔除重复数字的应该是比较全面稳妥的做法
本顿的测试导出100个,偶尔是会出现重复的,
如果数字更大一些,重复的会多一些。
回忆到以前学概率的时候哎,0-9组成 4位数,每一位不重复,第一位不能为0
9*9*8*7=4536 种不同结果
[ 本帖最后由 523066680 于 2010-9-27 22:40 编辑 ]
作者: 523066680 时间: 2010-9-27 22:37
我测了一下总数
15楼的代码找到漏洞:
筛选重复数字的部分:
for /l %%j in (0,1,9) do (
set ss=!#%%i:%%j=!
if !ss! lss 100 (set "#%%i=")
)
这里,比如数字是1023 , 剔除1=023
而023<100 所以会被清理。 所以15楼的代码永远不会出现10开头的4位数
作者: netbenton 时间: 2010-9-28 04:57
27楼回贴只看到第一个条件,
再来个满足两个条件的:(随机列出所有四位数,并满足一楼的两个条件要求)
- @echo off&setlocal enabledelayedexpansion
- for /l %%i in (0,1,9) do set ms=!ms! %%i
-
- set as=!ms: 0=!
- (
- for %%a in (!as!) do (
- set bs=!ms: %%a=!
- for %%b in (!bs!) do (
- set cs=!bs: %%b=!
- for %%c in (!cs!) do (
- set ds=!cs: %%c=!
- for %%d in (!ds!) do (
- echo;!random! %%a%%b%%c%%d
- ) ) ) )
-
- )>nums.tmp
- for /f "tokens=2" %%a in ('sort nums.tmp') do (echo;%%a)
- pause
复制代码
作者: leap 时间: 2010-9-28 15:10
- @echo off&setlocal enabledelayedexpansion
- set a=0123456789
- set b=
- set/p b=输入随机洗牌次数:
- :1
- set/a n=!random!%%10
- set/a b-=1
- if !b! equ 0 (echo 洗牌完毕&goto 2)
- set aa=!a:~%n%,1!
- set a=!aa!!a:%aa%=!
- echo !a!>a.txt
- goto 1
- :2
- for /f %%i in (a.txt) do (
- set jg=%%i
- set jg1=!jg:~1,4!
- set jg2=!jg:~2,4!
- if !jg1! gtr 999 (echo !jg1!) else (echo !jg2!
- ))
- pause&del a.txt
复制代码
作者: leap 时间: 2010-9-28 15:58
- @echo off&setlocal enabledelayedexpansion
- set a=0123456789
- set b=10
- set tt=
- set/p tt=输入您需要的几位不重复数字:
- set ttt=9999999999
- :1
- set ttt=!ttt:~0,%tt%-1!
- set/a n=!random!%%10
- set/a b-=1
- if !b! equ 0 (echo 洗牌完毕&goto 2)
- set aa=!a:~%n%,1!
- set a=!aa!!a:%aa%=!
- echo !a!>a.txt
- goto 1
- :2
- for /f %%i in (a.txt) do (
- set jg=%%i
- set jg1=!jg:~0,%tt%!
- set jg2=!jg:~1,%tt%!
- if !jg1! gtr !ttt! (echo !jg1!) else (echo !jg2!
- ))
- pause&del a.txt
复制代码
作者: cjiabing 时间: 2010-9-28 17:48
投机取巧,但并非每次都得
- @echo off&setlocal enabledelayedexpansion
- :d
- set ddr=!random!
- echo 原始随机数:!ddr!
- set ddd=!ddr:-4,1!
- if defined ddd if not "!ddr:~-1,1!"=="!ddr:~-2,1!" if not "!ddr:~-3,1!"=="!ddr:~-4,1!" if not "!ddr:~-1,1!"=="!ddr:~-3,1!" if not "!ddr:~-2,1!"=="!ddr:~-4,1!" if not "!ddr:~-2,1!"=="!ddr:~-3,1!" if not "!ddr:~-1,1!"=="!ddr:~-4,1!" echo 新生随机数:!ddr:~-1,1!!ddr:~-2,1!!ddr:~-3,1!!ddr:~-4,1!||goto d
- pause
- goto d
复制代码
作者: edmond 时间: 2010-9-28 18:10
@echo off
setlocal enabledelayedexpansion
:start
set n=1
:loop
set/a a1=!random!%%9
set/a a2=!random!%%9
set/a a3=!random!%%9
set/a a4=!random!%%9
if !a1!==!a2! (goto loop)
if !a2!==!a3! (goto loop)
if !a3!==!a4! (goto loop)
if !a1!==!a4! (goto loop)
if !a1!==!a3! (goto loop)
if !a2!==!a4! (goto loop)
if !a1!==0 (goto loop)
set res!n!=!a1!!a2!!a3!!a4!
set/a n+=1
if !n!==5 (goto ss)
goto loop
:ss
if !res1!==!res2! (goto start)
if !res2!==!res3! (goto start)
if !res3!==!res4! (goto start)
if !res1!==!res4! (goto start)
if !res1!==!res3! (goto start)
if !res2!==!res4! (goto start)
echo !res1!
echo !res2!
echo !res3!
echo !res4!
pause
作者: lvsehuaxue 时间: 2010-10-24 20:59
- @echo off&setlocal enabledelayedexpansion
- :a1
- set n=0
- :a
- set /a var=%random% %% 9000 +1000
- set v1=%var:~,1%
- set v2=%var:~1,1%
- set v3=%var:~2,1%
- set v4=%var:~3,1%
- if %v1% neq %v2% (
- if %v1% neq %v3% (
- if %v1% neq %v4% (
- if %v2% neq %v3% (
- if %v2% neq %v4% (
- if %v3% neq %v4% (
- goto b
- ) else (
- goto a
- ))))))
- :b
- set /a n+=1
- set var%n%=%var%
- if %n% lss 4 goto a
- if %var1% neq %var2% (
- if %var1% neq %var3% (
- if %var1% neq %var4% (
- if %var2% neq %var3% (
- if %var2% neq %var4% (
- if %var3% neq %var4% (
- goto c
- ) else (
- goto a1
- ))))))
- :c
- echo %var1%
- echo %var2%
- echo %var3%
- echo %var4%
- pause
复制代码
作者: lvsehuaxue 时间: 2010-10-24 21:05 标题: 好理解一点的
- @echo off
- :a1
- set n=0
- :a
- set /a var=%random% %% 9000 +1000
- set v1=%var:~,1%
- set v2=%var:~1,1%
- set v3=%var:~2,1%
- set v4=%var:~3,1%
- if %v1%==%v2% goto a
- if %v1%==%v3% goto a
- if %v1%==%v4% goto a
- if %v2%==%v3% goto a
- if %v2%==%v4% goto a
- if %v3%==%v4% goto a
- set /a n+=1
- set var%n%=%var%
- if %n% lss 4 goto a
- if %var1%==%var2% pause&goto a1
- if %var1%==%var3% pause&goto a1
- if %var1%==%var4% pause&goto a1
- if %var2%==%var3% pause&goto a1
- if %var2%==%var4% pause&goto a1
- if %var3%==%var4% pause&goto a1
- echo %var1%
- echo %var2%
- echo %var3%
- echo %var4%
- pause
复制代码
作者: jixun66 时间: 2010-10-26 01:02
- @echo off
- call :n r1
- call :n r2
- call :n r3
- call :n r4
- if not %r1%==%r2% if not %r2%==%r3% if not %r3%==%r4% goto fin
- %0
- :n
- set /a %1=%random%%%9+1
- goto :eof
- :fin
- echo %r1%%r2%%r3%%r4%
- pause>nul
- %0
复制代码
虽然麻烦了点……但是电脑运行的速度足够在一秒之内算出来了吧。
[ 本帖最后由 jixun66 于 2010-10-26 01:03 编辑 ]
作者: skuny 时间: 2010-12-25 14:21
- @echo off
- setlocal enabledelayedexpansion
- set str=0123456789
- for /l %%i in (1 1 20) do (
- for /l %%i in (1 1 11) do (
- set /a a=!random! %% 9
- call set str=!a!%%str:!a!=%%
- )
- set str0=!str:~-4,1!
- if !str0!==0 (echo !str:~-5,4!) else echo !str:~-4,4!
- )
- pause
复制代码
用楼主的 代码 扩展一下哈哈
作者: ithinkican 时间: 2010-12-26 00:21
内容………
作者: mac007cn 时间: 2010-12-27 16:31
- @echo off
- set /a "x=%random%%%10000"
- if %x% lss 1000 ( set /a "x+=1000" )
- echo %x%
复制代码
作者: caruko 时间: 2010-12-31 19:09
大概是中规中矩的办法吧...- @echo off
- setlocal enabledelayedexpansion
- set str=1234567890
- set n=9
- for /l %%a in (1 1 4) do (
- set /a rd=!random!%%!n!
- call set n%%a=%%str:~!rd!,1%%
- call set str=%%str:!n%%a!=%%
- set /a n=!n!-1
- )
- echo %n1%%n2%%n3%%n4%
复制代码
作者: mac007cn 时间: 2011-1-13 09:54
关于楼主这个题目,目前为止(竟然3年多了)几乎没有人做到楼主的第2个要求,正如楼主在10楼所说,“对于多个随机数,没有进行重复性判断(尽管这种几率很小)”。我想,如果把这个题目的要求1改一下,生成100个3位数或者10个2位数,这样重复的几率就很大了,必须考虑判断重复性。
下面是俺写的一段关于判断重复性的代码:- set "AllNum="
- :LOOP
- 产生一个满足要求1的随机数num的部分代码略
- REM 判断重复性
- if not defined AllNum (
- set "AllNum=%num%"
- set /a n=1
- goto :LOOP
- )
- set "temp=%AllNum%"
- set "temp=!temp:%num%=!
- REM 如果%AllNum%去掉%num%前后是同一个字符串,
- REM 则说明%num%与先前产生的随机数不重复。
- if "%temp%"=="%AllNum%" (
- set "AllNum=%AllNum%,%num%"
- set /a n+=1
- if !n! geq 4 goto :LIST
- )
- goto :LOOP
-
- :LIST
- echo %AllNum%
复制代码
[ 本帖最后由 mac007cn 于 2011-1-13 10:04 编辑 ]
作者: stuqx 时间: 2011-1-13 18:02
稍等一下 正在修改 有问题
[ 本帖最后由 stuqx 于 2011-1-13 18:13 编辑 ]
作者: common 时间: 2011-6-14 22:21
用了最笨的方法,但可以实现功能
为什么我总是想不到简单的方法,是我对命令还不够熟悉吗?- @echo off
- setlocal enabledelayedexpansion
- :sat
- set num=%random%
- if %num% lss 1000 goto :sat
- if %num% gtr 9999 goto :sat
- set a=%num:~0,1%
- set b=%num:~1,1%
- set c=%num:~2,1%
- set d=%num:~3,1%
- echo !a!
- echo !b!
- echo !c!
- echo !d!
- if !a! == !b! goto :sat
- if !a! == !c! goto :sat
- if !a! == !d! goto :sat
- if !b! == !c! goto :sat
- if !b! == !d! goto :sat
- if !c! == !d! goto :sat
- echo %num%
- pause
复制代码
作者: scarcr 时间: 2011-8-7 01:03
本帖最后由 scarcr 于 2011-8-7 11:00 编辑
嗯,首先,我遇到了一个麻烦,从昨天晚上6点弄个现在,7个小时,学到了许多也没有解决。
我在运行 call set %%var:%a%=%%这种类型的嵌套变量的时候是注定要跳错进入死循环的。
自我无奈之后,坛子里有这种句式的代码我也运行了六七套,全部失败。
看来,非战之罪。所以,我还是把我写的代码交上来吧,大家看看,有错帮我找出来啊。谢谢。
我在想我用的盗版xp还真的是恶心人啊,就是贪ghost方便了,结果系统驱动也没有装好,运行ghost总有意外的惊喜,
不过我是有正版的xp序列号的,还是professional,不过这年头装原版xp是有自残倾向的,太慢了,又太费劲了。
15楼的这段的'set #'这里是什么意思,什么效果,理解不能呢。
for /f "tokens=2 delims=#=" %%i in ('set #') do echo %%i
这段实现了题目的全部要求,生成四个四位不同的不同的随机数。
第二个for循环我手动输入数测试了一下,没有问题,这个程序理论上可以生成所有的四位不同的四位数,只是会越来越慢
只要改一下!m! equ 4这里,还有第二个for循环的( 1 1 4 )这里,把4改成别的数,可以获得想要位数的四位不同随机数,
如果使用变量,可以由键盘输入需要数目的随机数,这样题目的要求就扩展了。
我认为我完成了。累死了。- @echo off&setlocal enabledelayedexpansion
- :A
- if !m! equ 4 (pause&goto :eof)
- set /a nu=%random%%%9000+1000&set a=%nu%
- for /l %%i in (1,1,3) do (
- set "b=!a:~,1!"&&set "c=!a:~1!"
- call set "b=%%a:!b!=%%"
- if !b! equ !c! (set a=!c!) else (goto A)
- )
- for /l %%i in (1,1,4) do (
- if "!#%%i!"=="" (
- set #%%i=!nu!&&echo !#%%i!&&set /a m+=1&&goto A
- ) else if !#%%i! equ !nu! (goto A))
复制代码
获得经验有二,
当你无法取得成功时,可以去看看成功人士的例子,也许会柳暗花明又一村。
第二个for循环的第一个if判断里应该使用&&而不是使用&,避免出现命令运行不完整的现象,嗯,我这里出现了,所以改成现在这个样子。
作者: keiamy 时间: 2014-3-14 15:17
測試了很久....還要多加努力- @echo off&setlocal enabledelayedexpansion
- :lp
- for /l %%i in (1 1 9) do set .!random!!random!=%%i
- for /f "tokens=1-2 delims==" %%i in ('set .') do (
- set /a n+=1,m=n%%4
- set "var=!var!%%j"
- if !m! equ 0 if not defined #!var:~-4! (
- echo !var:~-4!
- set /a "num+=1"
- set "#!var:~-4!=flag")
- if "!num!" equ "100" pause&exit
- set "%%i=")
- set "var="&set "n="
- goto lp
复制代码
作者: 楚牛香 时间: 2014-5-16 15:54
- @echo off
- :main
- set /a n=%random%%%10
- if %n%==0 goto main
- :y
- set /a m=%random%%%10
- if %m%==%n% (goto y) else (set /a b=10*m+n)
- :second
- set /a x=%random%%%10
- if %x%==%n% (goto second)
- if %x%==%m% (goto second) else (set /a b=100*x+b)
- :third
- set /a w=%random%%%10
- if %w%==0 (goto third)
- if %w%==%n% (goto third)
- if %w%==%m% (goto third)
- if %w%==%x% (goto third) else (set /a b=1000*w+b)
- echo %b%
- pause>nul
复制代码
作者: 楚牛香 时间: 2014-5-16 15:55
回复 47# 楚牛香
不知道有没有符号,可以实现或的意思,比如 如果m不等于x或者w的话,这句话有代码能写吗
作者: shelluserwlb 时间: 2014-11-8 16:20
本帖最后由 shelluserwlb 于 2014-11-9 15:58 编辑
- @echo off
- :again
- set /a h1=%random%%%9+1
- set /a h2=%random%%%9
- set /a h3=%random%%%9
- set /a h4=%random%%%9
- if %h1% neq %h2% (
- if %h1% neq %h3% (
- if %h1% neq %h4% (
- if %h2% neq %h3% (
- if %h2% neq %h4% (
- if %h3% neq %h4% (
- echo %h1%%h2%%h3%%h4%
- pause>nul
- ))))))
- goto :again
复制代码
作者: 尘丶 时间: 2015-8-10 11:10
- @echo off&setlocal enabledelayedexpansion
- set /a shuzi=%random%%%1000+1
- set /a shuzi1=%shuzi%*4-4
- for /l %%a in (1,1,9) do (
- for /l %%b in (0,1,9) do (
- for /l %%c in (0,1,9) do (
- for /l %%d in (0,1,9) do (
- if not %%a==%%b if not %%a==%%c if not %%a==%%d if not %%b==%%c if not %%b==%%d if not %%c==%
-
- %d (
- if not defined #%%a%%b%%c%%d (set /a n+=1&set #%%a%%b%%c%%d=1)
- if !n! geq !shuzi1! echo;%%a%%b%%c%%d&set /a t+=1
- if !t!==4 goto a
- )
- )
- )
- )
- )
- :a
- pause>nul
复制代码
这也算随机数了,就是值范围差不多,得改随机数。
作者: 路过 时间: 2015-9-3 21:46
- @echo off
- set d=0
- setlocal enabledelayedexpansion
-
- :lc
- set/a a=%random%%%9000+1000
- set p=n!a!
- for /l %%a in (0,1,9) do (set q=!p:%%a=!
- if !q! neq !p! (if "!q:~3,1!"=="" (goto lc)
- )
- )
- set/a d+=1
- echo;!a!
- if %d% equ 4 (pause&exit)
- goto lc
复制代码
生成4个
作者: wutarnow 时间: 2015-10-15 22:18
回复 1# youxi01 - @echo off
- setlocal enabledelayedexpansion
-
- for /l %%I in (1,1,4) do (
- call :CreateRandom
- echo !createRandom!
- )
- goto :EOF
-
- :CreateRandom
- set createRandom=%RANDOM%
- if %createRandom% LEQ 999 (
- goto :CreateRandom
- ) else if %createRandom% LSS 10000 (
- call :IsFourSame %createRandom%
- if !isFourSame! EQU 0 (
- exit /b
- ) else (
- goto :CreateRandom
- )
- ) else (
- goto :CreateRandom
- )
-
- :IsFourSame
- set value=%1
- set ch1=%value:~,1%
- set ch2=%value:~1,1%
- if %ch1% EQU %ch2% set isFourSame=1 & exit /b
- set ch3=%value:~2,1%
- if %ch3% EQU %ch1% set isFourSame=1 & exit /b
- if %ch3% EQU %ch2% set isFourSame=1 & exit /b
- set ch4=%value:~3,1%
- if %ch4% EQU %ch1% set isFourSame=1 & exit /b
- if %ch4% EQU %ch2% set isFourSame=1 & exit /b
- if %ch4% EQU %ch3% set isFourSame=1 & exit /b
- set isFourSame=0
- exit /b
复制代码
作者: unknown_world 时间: 2015-10-19 10:00
- @echo off
-
- ::设置四个变量a,b,c,d,产生四个1位的随机数组全四位数
-
- :sui1
- set /a i=%random% %% 10
- if %i% neq 0 (set /a a=%i%) else goto sui1
-
- :sui2
- set /a i=%random% %% 10
- if %i% neq %a% (set /a b=%i%) else goto sui2
-
-
- :sui3
- set /a i=%random% %% 10
- if %i% neq %a% if %i% neq %b% (set /a c=%i%) else goto sui3
-
- :sui4
- set /a i=%random% %% 10
- if %i% neq %a% if %i% neq %b% if %i% neq %c% (set /a d=%i%) else goto sui4
-
- echo %a%%b%%c%%d%
-
- pause >nul
复制代码
作者: unknown_world 时间: 2015-10-19 11:25
对53楼做下改进- @echo off
- ::设置四个变量a,b,c,d,产生四个1位的随机数组全四位数
-
- set /a i=%random% %% 9+1
- set a=%i%
-
- :sui2
- set /a i=%random% %% 10
- if %i% neq %a% (set /a b=%i%) else goto sui2
-
- :sui3
- set /a i=%random% %% 10
- if %i% neq %a% if %i% neq %b% (set /a c=%i%) else goto sui3
-
- :sui4
- set /a i=%random% %% 10
- if %i% neq %a% if %i% neq %b% if %i% neq %c% (set /a d=%i%) else goto sui4
-
- echo %a%%b%%c%%d%
- pause >nul
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |