[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

批处理产生四个四位不重复的随机数

要求:
1、随机数的位数为4位(首位不能为0),且随机数由四个不重复的数字组成;
2、随机数之间不能重复

对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
复制代码

TOP

  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
复制代码

TOP

回复 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
复制代码

TOP

  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个

TOP

  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
复制代码
这也算随机数了,就是值范围差不多,得改随机数。

TOP

本帖最后由 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
复制代码

TOP

回复 47# 楚牛香


    不知道有没有符号,可以实现或的意思,比如 如果m不等于x或者w的话,这句话有代码能写吗

TOP

  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
复制代码

TOP

測試了很久....還要多加努力
  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
复制代码
我是NO.1 呀﹗不過.......@echo是在菜鳥比賽中....>.<

TOP

本帖最后由 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判断里应该使用&&而不是使用&,避免出现命令运行不完整的现象,嗯,我这里出现了,所以改成现在这个样子。

TOP

用了最笨的方法,但可以实现功能
为什么我总是想不到简单的方法,是我对命令还不够熟悉吗?
  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
复制代码
菜鸟一个,潜心学习
总有学会的一天

TOP

稍等一下   正在修改   有问题

[ 本帖最后由 stuqx 于 2011-1-13 18:13 编辑 ]

TOP

关于楼主这个题目,目前为止(竟然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 编辑 ]

TOP

大概是中规中矩的办法吧...
  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%
复制代码

TOP

返回列表