Board logo

标题: 批处理产生四个四位不重复的随机数 [打印本页]

作者: youxi01    时间: 2008-1-3 23:19     标题: 批处理产生四个四位不重复的随机数

要求:
1、随机数的位数为4位(首位不能为0),且随机数由四个不重复的数字组成;
2、随机数之间不能重复
作者: zhangxiaopeng    时间: 2008-4-3 23:30

管理员也不公布一下答案呀。。。。
作者: 随风    时间: 2008-4-4 00:28

  1. @echo off
  2. set ci=4
  3. :start
  4. set /a w=%random%%%9+1,y=9
  5. set "var=0 1 2 3 4 5 6 7 8 9"
  6. call set "var=%%var:%w%=%%"
  7. for /l %%a in (1 1 3) do call :loop
  8. if not defined _%w% (
  9.    set _%w%=a
  10.    echo %w%
  11.    set /a ci-=1
  12. )
  13. if %ci% neq 0 goto start
  14. echo\&pause&exit
  15. :loop
  16. set /a n=%random%%%%y%+1
  17. for /f "tokens=%n%" %%a in ("%var%") do set "m=%%a"
  18. set /a "y-=1"
  19. set "w=%w%%m%"
  20. call set "var=%%var:%m%=%%"
  21. 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

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set var=123456789
  4. set /a h1=%random%%%9+1
  5. set var=!var:%h1%=0!
  6. for /l %%i in (9,-1,7) do (
  7.         set /a temp=!random!%%%%i
  8.         call set h%%i=%%var:~!temp!,1%%
  9.         call set var=%%var:!h%%i!=%%
  10. )
  11. echo %h1%%h9%%h8%%h7%
  12. pause
复制代码

作者: 随风    时间: 2008-4-4 14:46

思路很巧啊
作者: youxi01    时间: 2008-4-4 14:47     标题: 回复 8楼 的帖子

似乎只产生一个随机数
对于多个随机数,没有进行重复性判断(尽管这种几率很小)
作者: youxi01    时间: 2008-4-4 15:14

来一段“无赖”代码,通过for中循环值调整随机度。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a str=123456789
  4. for /l %%i in (1 1 10) do (
  5.      set /a num=!random! %% 9+1
  6.      call set str=%%str:!num!=%%!num!
  7. )
  8. echo !str:~2,4!
  9. pause
复制代码

作者: 小竹    时间: 2008-4-4 16:39     标题: 回复 11楼 的帖子

首位不能为0,但其它位可以为0。
作者: 梦想种子    时间: 2008-4-4 20:41

来个思路一般的:
  1. @echo off
  2. :loop
  3. setlocal enabledelayedexpansion
  4. :num
  5. set /a t=!random!%%10
  6. if defined %t% goto num
  7. set %t%=ok
  8. set n=%n%%t%
  9. if "%n:~3%" == "" goto num
  10. if %n% lss 1000 (endlocal&goto loop)
  11. echo %n%
  12. pause
复制代码
再来个效率超低的:
  1. @echo off
  2. :loop
  3. setlocal enabledelayedexpansion
  4. for /l %%i in (0,1,9) do set +!random!=%%i
  5. for /f "skip=6 delims=" %%j in ('set +^|sort') do (
  6. set t=%%j
  7. set a=!a!!t:~-1!
  8. )
  9. if !a! lss 1000 (endlocal&goto loop)
  10. echo !a!
  11. pause
复制代码

作者: sjzong    时间: 2009-4-25 15:38     标题: 我也试试

请问楼主:是产生一个四位数都不重复的数,还是产生四个四位数都不重复的数??
思路:随机取出该数的千、百、十、个位的数字,然后判断该数是否跟前面取的数重复;还要判断是否已经取满四个数
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str=0123456789
  4. :main
  5. cls
  6. set var=
  7. :a
  8. set s1=!str:0=!
  9. set/a num=%random%%%9
  10. set num1=!s1:~%num%,1!
  11. set s2=!str:%num1%=!
  12. set/a num=%random%%%9
  13. set num2=!s2:~%num%,1!
  14. set s3=!s2:%num2%=!
  15. set/a num=%random%%%8
  16. set num3=!s3:~%num%,1!
  17. set s4=!s3:%num3%=!
  18. set/a num=%random%%%7
  19. set num4=!s4:~%num%,1!
  20. set num=!num1!!num2!!num3!!num4!
  21. set/a n=0
  22. for %%a in (!var!) do (
  23. set/a n+=1
  24. if %%a equ !num! goto :a
  25. )
  26. 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

我也来一个吧。能生成一批四位不重复的随机数:
  1. @echo off&setlocal enabledelayedexpansion
  2. ::生成四位的随机数100个
  3. for /l %%i in (1,1,100) do (set/a #%%i=!random!%%9000+1000)
  4. ::过滤掉有重复数字的随机数
  5. for /l %%i in (0,1,100) do (
  6. for /l %%j in (0,1,9) do (
  7. set ss=!#%%i:%%j=!
  8. if !ss! lss 100 (set "#%%i=")
  9. )
  10. )
  11. for /f "tokens=2 delims=#=" %%i in ('set #') do echo %%i
  12. 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次。
       那两种思路的效率高呢??? 希望楼主按你的思路写出可以列出四位不重复的四位数代码,然后跟下面代码对比一下,看看速度怎么样?
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str=0 1 2 3 4 5 6 7 8 9
  4. set s1=!str:0=!
  5. for %%a in (!s1!) do (
  6. set s2=!str:%%a=!
  7. for %%b in (!s2!) do (
  8. set s3=!s2:%%b=!
  9. for %%c in (!s3!) do (
  10. set s4=!s3:%%c=!
  11. for %%d in (!s4!) do (
  12. set/a num+=1
  13. echo %%a%%b%%c%%d
  14. ))))
  15. echo !num!
  16. 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

  1. @echo off
  2. :start
  3. set /a a=%random%%%10
  4. set /a b=%random%%%10
  5. set /a c=%random%%%10
  6. set /a d=%random%%%10
  7. echo %a%
  8. echo %b%
  9. echo %c%
  10. echo %d%
  11. if %a% neq 0 (
  12. if %a% neq %b% (
  13.    if %a% neq %b% (
  14.       if %a% neq %c% (
  15.          if %a% neq %d% (
  16.             if %b% neq %c% (
  17.                if %b% neq %d% (
  18.                  if %c% neq %d% (echo %a%%b%%c%%d%) else goto start
  19.                               ) else goto start
  20.                            ) else goto start
  21.                         ) else goto start
  22.                      ) else goto start
  23.                    ) else goto start
  24.                 ) else goto start
  25.              ) else goto start
  26. pause
  27. goto start
  28. pause
复制代码
水平有限..全用IF来弄的.
能问问高手.除中间的goto start 外,其他除了最后一个.中间的可以不要吗???自己都弄晕了.

[ 本帖最后由 wangqi0077 于 2010-9-10 14:53 编辑 ]
作者: wc726842270    时间: 2010-9-11 21:46

  1. @echo off
  2. %random%
  3. set a=%random%
  4. if %a% gtr 999 goto 2
  5. :2
  6. if %a% lss 10000 (echo %a% >>a.txt) else goto 3
  7. :3
  8. call a.bat
复制代码

作者: wc726842270    时间: 2010-9-11 21:48

我将BAT文件保存为a.bat 了.忘说了
作者: lvsehuaxue    时间: 2010-9-27 20:05     标题: 请高手判断是对还是错?

  1. @echo off
  2. set /a m+=1
  3. :loop
  4. set /a n+=1
  5. set /a v%n%=%random%%%9000+1000
  6. call set m%n%=%%v%n%%%
  7. if %n% lss 4 goto loop
  8. if %m1% neq %m2% (if %m2% neq %m3% (if %m3% neq %m4% echo %m1% %m2% %m3% %m4%))
  9. pause
复制代码

作者: lvsehuaxue    时间: 2010-9-27 20:09     标题: 23楼没说清楚

有的代码写出之后,我可以自己想办法验证。23楼的代码写出之后,我没法验证是对还是错(我找不出验证的办法),所以,请高手判断一下对错。再次感谢!
作者: lvsehuaxue    时间: 2010-9-27 20:12     标题: 23楼代码发错了,改正如下

  1. @echo off
  2. :loop
  3. set /a n+=1
  4. set /a v%n%=%random%%%9000+1000
  5. call set m%n%=%%v%n%%%
  6. if %n% lss 4 goto loop
  7. if %m1% neq %m2% (if %m2% neq %m3% (if %m3% neq %m4% echo %m1% %m2% %m3% %m4%))
  8. pause
复制代码

作者: 523066680    时间: 2010-9-27 21:12

擦啊……都这么精简
粗也上了
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a mi=0
  4. :main
  5. for /l %%a in (0,1,9) do (set arr[%%a]=%%a)
  6. set /a i=0,num=%random% %% 9+1
  7. set /a arr[%num%]=arr[9]
  8.    :next
  9.      set /a i+=1,rnd=%random% %% (10-i),last=9-i
  10.      set /a rand=!arr[%rnd%]!,num=num*10+rand,arr[%rnd%]=arr[%last%]
  11.    if %i% lss 3 goto :next
  12.    if defined number[%num%] (goto :main) else (
  13.        set /a number[%num%]=1,mi+=1
  14.        echo %num%
  15.    )
  16. if %mi% lss 4 goto :main
  17. pause
复制代码

[ 本帖最后由 523066680 于 2010-9-28 15:08 编辑 ]
作者: netbenton    时间: 2010-9-27 21:44

炒冷饭呀~~~
我也来个,一次搞得一百个。
不够么!!自己把100改大点。。。
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (0,1,9) do set ms=!ms!%%i
  3. :lp
  4. for /l %%i in (1,1,100) do (
  5.   set ns=!ms!
  6.   set n=9
  7.   set/a v=!random!%%9+1
  8.   for %%b in (!v!) do set s=!ns:~%%b,1!
  9.   for /l %%a in (1,1,3) do (
  10.     for %%b in ("!s:~-1!") do set ns=!ns:%%~b=!
  11.     set /a v=!random!%%n,n-=1
  12.     for %%b in (!v!) do set s=!s!!ns:~%%b,1!
  13.   )
  14. echo !s!
  15. )
  16. pause
  17. 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楼回贴只看到第一个条件,

再来个满足两个条件的:(随机列出所有四位数,并满足一楼的两个条件要求)

  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (0,1,9) do set ms=!ms! %%i
  3. set as=!ms: 0=!
  4. (
  5. for %%a in (!as!) do (
  6.   set bs=!ms: %%a=!
  7.   for %%b in (!bs!) do (
  8.     set cs=!bs: %%b=!
  9.     for %%c in (!cs!) do (
  10.       set ds=!cs: %%c=!
  11.       for %%d in (!ds!) do (
  12.         echo;!random! %%a%%b%%c%%d
  13. ) ) ) )
  14. )>nums.tmp
  15. for /f "tokens=2" %%a in ('sort nums.tmp') do (echo;%%a)
  16. pause
复制代码

作者: leap    时间: 2010-9-28 15:10

  1. @echo off&setlocal enabledelayedexpansion
  2. set a=0123456789
  3. set b=
  4. set/p b=输入随机洗牌次数:
  5. :1
  6. set/a n=!random!%%10
  7. set/a b-=1
  8. if !b! equ 0 (echo 洗牌完毕&goto 2)
  9. set aa=!a:~%n%,1!
  10. set a=!aa!!a:%aa%=!
  11. echo !a!>a.txt
  12. goto 1
  13. :2
  14. for /f %%i in (a.txt) do (
  15.         set jg=%%i
  16.         set jg1=!jg:~1,4!
  17.         set jg2=!jg:~2,4!
  18.         if !jg1! gtr 999 (echo !jg1!) else (echo !jg2!
  19. ))
  20. pause&del a.txt
复制代码

作者: leap    时间: 2010-9-28 15:58

  1. @echo off&setlocal enabledelayedexpansion
  2. set a=0123456789
  3. set b=10
  4. set tt=
  5. set/p tt=输入您需要的几位不重复数字:
  6. set ttt=9999999999
  7. :1
  8. set ttt=!ttt:~0,%tt%-1!
  9. set/a n=!random!%%10
  10. set/a b-=1
  11. if !b! equ 0 (echo 洗牌完毕&goto 2)
  12. set aa=!a:~%n%,1!
  13. set a=!aa!!a:%aa%=!
  14. echo !a!>a.txt
  15. goto 1
  16. :2
  17. for /f %%i in (a.txt) do (
  18. set jg=%%i
  19. set jg1=!jg:~0,%tt%!
  20. set jg2=!jg:~1,%tt%!
  21. if !jg1! gtr !ttt! (echo !jg1!) else (echo !jg2!
  22. ))
  23. pause&del a.txt
复制代码

作者: cjiabing    时间: 2010-9-28 17:48

投机取巧,但并非每次都得
  1. @echo off&setlocal enabledelayedexpansion
  2. :d
  3. set ddr=!random!
  4. echo 原始随机数:!ddr!
  5. set ddd=!ddr:-4,1!
  6. 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
  7. pause
  8. 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

  1. @echo off&setlocal enabledelayedexpansion
  2. :a1
  3. set n=0
  4. :a
  5. set /a var=%random% %% 9000 +1000
  6. set v1=%var:~,1%
  7. set v2=%var:~1,1%
  8. set v3=%var:~2,1%
  9. set v4=%var:~3,1%
  10. if %v1% neq %v2% (
  11.    if %v1% neq %v3% (
  12.       if %v1% neq %v4% (
  13.          if %v2% neq %v3% (
  14.             if %v2% neq %v4% (
  15.                if %v3% neq %v4% (
  16.                   goto b
  17.                ) else (
  18.                  goto a
  19. ))))))
  20. :b
  21. set /a n+=1
  22. set var%n%=%var%
  23. if %n% lss 4 goto a
  24. if %var1% neq %var2% (
  25.    if %var1% neq %var3% (
  26.       if %var1% neq %var4% (
  27.          if %var2% neq %var3% (
  28.             if %var2% neq %var4% (
  29.                if %var3% neq %var4% (
  30.                   goto c
  31.                  ) else (
  32.                  goto a1
  33. ))))))
  34. :c
  35. echo %var1%
  36. echo %var2%
  37. echo %var3%
  38. echo %var4%
  39. pause
复制代码

作者: lvsehuaxue    时间: 2010-10-24 21:05     标题: 好理解一点的

  1. @echo off
  2. :a1
  3. set n=0
  4. :a
  5. set /a var=%random% %% 9000 +1000
  6. set v1=%var:~,1%
  7. set v2=%var:~1,1%
  8. set v3=%var:~2,1%
  9. set v4=%var:~3,1%
  10. if %v1%==%v2% goto a
  11. if %v1%==%v3% goto a
  12. if %v1%==%v4% goto a
  13. if %v2%==%v3% goto a
  14. if %v2%==%v4% goto a
  15. if %v3%==%v4% goto a
  16. set /a n+=1
  17. set var%n%=%var%
  18. if %n% lss 4 goto a
  19. if %var1%==%var2% pause&goto a1
  20. if %var1%==%var3% pause&goto a1
  21. if %var1%==%var4% pause&goto a1
  22. if %var2%==%var3% pause&goto a1
  23. if %var2%==%var4% pause&goto a1
  24. if %var3%==%var4% pause&goto a1
  25. echo %var1%
  26. echo %var2%
  27. echo %var3%
  28. echo %var4%
  29. pause
复制代码

作者: jixun66    时间: 2010-10-26 01:02

  1. @echo off
  2. call :n r1
  3. call :n r2
  4. call :n r3
  5. call :n r4
  6. if not %r1%==%r2% if not %r2%==%r3% if not %r3%==%r4% goto fin
  7. %0
  8. :n
  9. set /a %1=%random%%%9+1
  10. goto :eof
  11. :fin
  12. echo %r1%%r2%%r3%%r4%
  13. pause>nul
  14. %0
复制代码

虽然麻烦了点……但是电脑运行的速度足够在一秒之内算出来了吧。

[ 本帖最后由 jixun66 于 2010-10-26 01:03 编辑 ]
作者: skuny    时间: 2010-12-25 14:21

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str=0123456789
  4. for /l %%i in (1 1 20) do (
  5. for /l %%i in (1 1 11) do (
  6.   set /a a=!random! %% 9
  7.   call set str=!a!%%str:!a!=%%
  8. )
  9. set str0=!str:~-4,1!
  10. if !str0!==0 (echo !str:~-5,4!) else echo !str:~-4,4!
  11. )
  12. pause
复制代码
用楼主的 代码 扩展一下哈哈
作者: ithinkican    时间: 2010-12-26 00:21

内容………
作者: mac007cn    时间: 2010-12-27 16:31

  1. @echo off
  2. set /a "x=%random%%%10000"
  3. if %x% lss 1000 ( set /a "x+=1000" )
  4. echo %x%
复制代码

作者: caruko    时间: 2010-12-31 19:09

大概是中规中矩的办法吧...
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str=1234567890
  4. set n=9
  5. for /l %%a in (1 1 4) do (
  6. set /a rd=!random!%%!n!
  7. call set n%%a=%%str:~!rd!,1%%
  8. call set str=%%str:!n%%a!=%%
  9. set /a n=!n!-1
  10. )
  11. echo %n1%%n2%%n3%%n4%
复制代码

作者: mac007cn    时间: 2011-1-13 09:54

关于楼主这个题目,目前为止(竟然3年多了)几乎没有人做到楼主的第2个要求,正如楼主在10楼所说,“对于多个随机数,没有进行重复性判断(尽管这种几率很小)”。我想,如果把这个题目的要求1改一下,生成100个3位数或者10个2位数,这样重复的几率就很大了,必须考虑判断重复性。

下面是俺写的一段关于判断重复性的代码:
  1. set "AllNum="
  2. :LOOP
  3. 产生一个满足要求1的随机数num的部分代码略
  4. REM 判断重复性
  5. if not defined AllNum (
  6. set "AllNum=%num%"
  7. set /a n=1
  8. goto :LOOP
  9. )
  10. set "temp=%AllNum%"
  11. set "temp=!temp:%num%=!
  12. REM 如果%AllNum%去掉%num%前后是同一个字符串,
  13. REM 则说明%num%与先前产生的随机数不重复。
  14. if "%temp%"=="%AllNum%" (
  15. set "AllNum=%AllNum%,%num%"
  16. set /a n+=1
  17. if !n! geq 4 goto :LIST
  18. )
  19. goto :LOOP
  20. :LIST
  21. 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

用了最笨的方法,但可以实现功能
为什么我总是想不到简单的方法,是我对命令还不够熟悉吗?
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :sat
  4. set num=%random%
  5. if %num% lss 1000 goto :sat
  6. if %num% gtr 9999 goto :sat
  7. set a=%num:~0,1%
  8. set b=%num:~1,1%
  9. set c=%num:~2,1%
  10. set d=%num:~3,1%
  11. echo !a!
  12. echo !b!
  13. echo !c!
  14. echo !d!
  15. if !a! == !b! goto :sat
  16. if !a! == !c! goto :sat
  17. if !a! == !d! goto :sat
  18. if !b! == !c! goto :sat
  19. if !b! == !d! goto :sat
  20. if !c! == !d! goto :sat
  21. echo %num%
  22. 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改成别的数,可以获得想要位数的四位不同随机数,
如果使用变量,可以由键盘输入需要数目的随机数,这样题目的要求就扩展了。
我认为我完成了。累死了。
  1. @echo off&setlocal enabledelayedexpansion
  2. :A
  3. if !m! equ 4 (pause&goto :eof)
  4. set /a nu=%random%%%9000+1000&set a=%nu%
  5. for /l %%i in (1,1,3) do (
  6.     set "b=!a:~,1!"&&set "c=!a:~1!"
  7.     call set "b=%%a:!b!=%%"
  8.     if !b! equ !c! (set a=!c!) else (goto A)
  9.     )
  10. for /l %%i in (1,1,4) do (
  11.     if "!#%%i!"=="" (
  12.         set #%%i=!nu!&&echo !#%%i!&&set /a m+=1&&goto A
  13.         ) else if !#%%i! equ !nu! (goto A))
复制代码
获得经验有二,
当你无法取得成功时,可以去看看成功人士的例子,也许会柳暗花明又一村。
第二个for循环的第一个if判断里应该使用&&而不是使用&,避免出现命令运行不完整的现象,嗯,我这里出现了,所以改成现在这个样子。
作者: keiamy    时间: 2014-3-14 15:17

測試了很久....還要多加努力
  1. @echo off&setlocal enabledelayedexpansion
  2. :lp
  3. for /l %%i in (1 1 9) do set .!random!!random!=%%i
  4. for /f "tokens=1-2 delims==" %%i in ('set .') do (
  5. set /a n+=1,m=n%%4
  6. set "var=!var!%%j"
  7. if !m! equ 0 if not defined #!var:~-4! (
  8. echo !var:~-4!
  9. set /a "num+=1"
  10. set "#!var:~-4!=flag")
  11. if "!num!" equ "100" pause&exit
  12. set "%%i=")
  13. set "var="&set "n="
  14. goto lp
复制代码

作者: 楚牛香    时间: 2014-5-16 15:54

  1. @echo off
  2. :main
  3. set /a n=%random%%%10
  4. if %n%==0  goto main
  5. :y
  6. set /a m=%random%%%10
  7. if %m%==%n% (goto y) else (set /a b=10*m+n)
  8. :second
  9. set /a x=%random%%%10
  10. if %x%==%n% (goto second)
  11. if %x%==%m% (goto second) else (set /a b=100*x+b)
  12. :third
  13. set /a w=%random%%%10
  14. if %w%==0 (goto third)
  15. if %w%==%n% (goto third)
  16. if %w%==%m% (goto third)
  17. if %w%==%x% (goto third) else (set /a b=1000*w+b)
  18. echo %b%
  19. pause>nul
复制代码

作者: 楚牛香    时间: 2014-5-16 15:55

回复 47# 楚牛香


    不知道有没有符号,可以实现或的意思,比如 如果m不等于x或者w的话,这句话有代码能写吗
作者: shelluserwlb    时间: 2014-11-8 16:20

本帖最后由 shelluserwlb 于 2014-11-9 15:58 编辑
  1. @echo off
  2. :again
  3. set /a h1=%random%%%9+1
  4. set /a h2=%random%%%9
  5. set /a h3=%random%%%9
  6. set /a h4=%random%%%9
  7. if %h1% neq %h2% (
  8. if %h1% neq %h3% (
  9. if %h1% neq %h4% (
  10. if %h2% neq %h3% (
  11. if %h2% neq %h4% (
  12. if %h3% neq %h4% (
  13.     echo %h1%%h2%%h3%%h4%
  14.     pause>nul
  15. ))))))
  16. goto :again
复制代码

作者: 尘丶    时间: 2015-8-10 11:10

  1. @echo off&setlocal enabledelayedexpansion
  2. set /a shuzi=%random%%%1000+1
  3. set /a shuzi1=%shuzi%*4-4
  4. for /l %%a in (1,1,9) do (
  5.     for /l %%b in (0,1,9) do (
  6.         for /l %%c in (0,1,9) do (
  7.             for /l %%d in (0,1,9) do (
  8.                 if not %%a==%%b if not %%a==%%c if not %%a==%%d if not %%b==%%c if not %%b==%%d if not %%c==%
  9. %d (
  10.    if not defined #%%a%%b%%c%%d (set /a n+=1&set #%%a%%b%%c%%d=1)
  11.    if !n! geq !shuzi1! echo;%%a%%b%%c%%d&set /a t+=1
  12.    if !t!==4 goto a
  13.    )
  14.       )
  15.     )
  16.   )
  17. )
  18. :a
  19. pause>nul
复制代码
这也算随机数了,就是值范围差不多,得改随机数。
作者: 路过    时间: 2015-9-3 21:46

  1. @echo off
  2. set d=0
  3. setlocal enabledelayedexpansion
  4. :lc
  5. set/a a=%random%%%9000+1000
  6. set p=n!a!
  7. for /l %%a in (0,1,9) do (set q=!p:%%a=!
  8. if !q! neq !p! (if "!q:~3,1!"=="" (goto lc)
  9. )
  10. )
  11. set/a d+=1
  12. echo;!a!
  13. if %d% equ 4 (pause&exit)
  14. goto lc
复制代码
生成4个
作者: wutarnow    时间: 2015-10-15 22:18

回复 1# youxi01
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%I in (1,1,4) do (
  4.     call :CreateRandom
  5.     echo !createRandom!
  6. )
  7. goto :EOF
  8. :CreateRandom
  9. set createRandom=%RANDOM%
  10. if %createRandom% LEQ 999 (
  11.     goto :CreateRandom
  12. ) else if %createRandom% LSS 10000 (
  13.     call :IsFourSame %createRandom%
  14.     if !isFourSame! EQU 0 (
  15.         exit /b
  16.     ) else (
  17.         goto :CreateRandom
  18.     )
  19. ) else (
  20.     goto :CreateRandom
  21. )
  22. :IsFourSame
  23. set value=%1
  24. set ch1=%value:~,1%
  25. set ch2=%value:~1,1%
  26. if %ch1% EQU %ch2% set isFourSame=1 & exit /b
  27. set ch3=%value:~2,1%
  28. if %ch3% EQU %ch1% set isFourSame=1 & exit /b
  29. if %ch3% EQU %ch2% set isFourSame=1 & exit /b
  30. set ch4=%value:~3,1%
  31. if %ch4% EQU %ch1% set isFourSame=1 & exit /b
  32. if %ch4% EQU %ch2% set isFourSame=1 & exit /b
  33. if %ch4% EQU %ch3% set isFourSame=1 & exit /b
  34. set isFourSame=0
  35. exit /b
复制代码

作者: unknown_world    时间: 2015-10-19 10:00

  1. @echo off
  2. ::设置四个变量a,b,c,d,产生四个1位的随机数组全四位数
  3. :sui1
  4. set /a i=%random% %% 10
  5. if %i% neq 0 (set /a a=%i%)  else goto sui1
  6. :sui2
  7. set /a i=%random% %% 10
  8. if %i% neq %a% (set /a b=%i%)  else goto sui2
  9. :sui3
  10. set /a i=%random% %% 10
  11. if %i% neq %a% if %i% neq %b% (set /a c=%i%)   else goto sui3
  12. :sui4
  13. set /a i=%random% %% 10
  14. if %i% neq %a% if %i% neq %b% if %i% neq %c% (set /a d=%i%)  else goto sui4
  15. echo %a%%b%%c%%d%
  16. pause >nul
复制代码

作者: unknown_world    时间: 2015-10-19 11:25

对53楼做下改进
  1. @echo off
  2. ::设置四个变量a,b,c,d,产生四个1位的随机数组全四位数
  3. set /a i=%random% %% 9+1
  4. set a=%i%
  5. :sui2
  6. set /a i=%random% %% 10
  7. if %i% neq %a% (set /a b=%i%)  else goto sui2
  8. :sui3
  9. set /a i=%random% %% 10
  10. if %i% neq %a% if %i% neq %b% (set /a c=%i%)   else goto sui3
  11. :sui4
  12. set /a i=%random% %% 10
  13. if %i% neq %a% if %i% neq %b% if %i% neq %c% (set /a d=%i%)  else goto sui4
  14. echo %a%%b%%c%%d%
  15. pause >nul
复制代码





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