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

回复 15楼 的帖子

功力不错啊,学什么的。
赞!
技术问题请到论坛发帖求助!

TOP

15L的代码强。。。

不过能保证100个数以内肯定能生成么。。。
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

回 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,虽然这种概率很小的!但毕竟存在。

TOP

如果按顺序排列。这个题目基本上没有难度了。(问题变成了:找出10000以内没有重复数字的四位数)

题目要求是, 生成四个随机的,没有重复数字的四位随机数

15的代码还存在相同数字的可能性。

有更好的改进代码,请跟进

[ 本帖最后由 inittab 于 2009-4-26 17:26 编辑 ]

TOP

  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 编辑 ]

TOP

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

TOP

我将BAT文件保存为a.bat 了.忘说了

TOP

请高手判断是对还是错?

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

TOP

23楼没说清楚

有的代码写出之后,我可以自己想办法验证。23楼的代码写出之后,我没法验证是对还是错(我找不出验证的办法),所以,请高手判断一下对错。再次感谢!

TOP

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

TOP

擦啊……都这么精简
粗也上了
  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 编辑 ]

TOP

炒冷饭呀~~~
我也来个,一次搞得一百个。
不够么!!自己把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
复制代码

TOP

回复 27楼 的帖子

刚刚想了一下 , inittab 的剔除重复数字的应该是比较全面稳妥的做法
本顿的测试导出100个,偶尔是会出现重复的,
如果数字更大一些,重复的会多一些。

回忆到以前学概率的时候哎,0-9组成 4位数,每一位不重复,第一位不能为0
9*9*8*7=4536 种不同结果

[ 本帖最后由 523066680 于 2010-9-27 22:40 编辑 ]

TOP

我测了一下总数
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位数

TOP

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

评分人数

TOP

返回列表