找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 49584|回复: 22

[ 新手练习 小结 ] 批处理寻找随机数

[复制链接]
发表于 2008-11-21 13:54:22 | 显示全部楼层 |阅读模式
  1. set %random%=%random%
复制代码
目的:大家也从习题集中学了不少了。这个题目将综合考察新手们对 for、set 的运用能力,当然基础部分的变量截取、随机数等也有涉及。

要求:添加代码找出这两个随机数(一个是变量,另一个是它的值),并计算出这两个数各位数字的和。方法不限,可以生成临时文件,当然不用临时文件更好。

随机数如果是这样的:123=456,
那么 [各位数字的和] = 1 + 2 + 3 + 4 + 5 + 6。
==================================
显示时不要求显示过程,可以这样显示:
随机变量为 123,其值为 456;
各位数的和为 21。

上面的这行代码不能改动,这个要求和以前是一样的。

评分:完美代码 10:
   无临时文件 3,
   代码简洁 3,
   速度 2,
   代码可读性 2。
参考:set 命令使用 详解
http://bbs.bathome.net/thread-57-1-1.html
for 语句从入门到精通
http://bbs.bathome.net/thread-2189-1-1.html
set 截取字符详解
http://bbs.bathome.net/thread-996-1-2.html

[ 本帖最后由 wxcute 于 2008-11-21 18:53 编辑 ]

评分

参与人数 1PB +2 收起 理由
lhjoanna + 2 支持一下!!分不多,别嫌弃啊~~

查看全部评分

发表于 2008-11-21 16:42:04 | 显示全部楼层
呵,wxcute兄出的题目越来越有水平了,说难也不难,说不难也的确要动一下脑子。强烈支持!!!

  1. @echo off&setlocal enabledelayedexpansion
  2. set %random%=%random%
  3. for /f "delims=" %%i in ('set') do set str=%%i&goto start
  4. :start
  5. echo %str%
  6. for /f "tokens=1,2 delims==" %%i in ("%str%") do set num=%%i%%j
  7. :calc
  8. set var=!num:~,1!
  9. set /a s+=var
  10. set /p=%var%+<nul
  11. set num=!num:~1!
  12. if defined num goto calc
  13. set /p==!s!<nul
  14. pause>nul
复制代码

[ 本帖最后由 lhjoanna 于 2008-11-21 16:53 编辑 ]

评分

参与人数 1PB +8 收起 理由
wxcute + 8

查看全部评分

发表于 2008-11-21 17:09:32 | 显示全部楼层
修改了一下,通过屏蔽错误输出,从而省略去掉str中“=”的步骤!可以稍微提高点效率~~
  1. @echo off&setlocal enabledelayedexpansion
  2. set %random%=%random%
  3. for /f "delims=" %%i in ('set') do set str=%%i&goto start
  4. :start
  5. echo %str%
  6. :calc
  7. set var=!str:~,1!
  8. set /a s+=var
  9. set /p=%var%+<nul 2>nul
  10. set str=!str:~1!
  11. if defined str goto calc
  12. set /p==!s!<nul
  13. pause>nul
复制代码

[ 本帖最后由 lhjoanna 于 2008-11-21 17:11 编辑 ]

评分

参与人数 1PB +3 收起 理由
wxcute + 3 追回分

查看全部评分

发表于 2008-11-25 11:10:47 | 显示全部楼层
@echo off
set a=%random%=%random%
echo %a%
:calc
set var=%a:~,1%
set /a s+=var
set /p=%var%+<nul 2>nul
set a=%a:~1%
if defined a goto calc
set /p==%s%<nul
pause>nul

评分

参与人数 1PB +2 收起 理由
wxcute + 2 没有看清题意。

查看全部评分

发表于 2008-11-25 18:36:05 | 显示全部楼层
set %random%=%random%
上面的这行代码不能改动,
这个要求是否有点高了?随机数,如何获取变量名?难道要通过判断变量名是否为纯数字?如此代码是否复杂化了?
 楼主| 发表于 2008-11-25 19:23:12 | 显示全部楼层

回复 6楼 的帖子

因为此题是本练习题的一个小结,属于一个综合性的题目。因为题目是连贯性的,所以只要弄明白了前面的题目,这一题就不会很难了。

唯一的比较难的点就是找到这个变量,这就看大家有没有掌握关于 SET 命令显示变量的用法了。

还有就是显示的时候没必要像 2 楼一样显示过程,像顶楼蓝字下面一样显示结果就行了。
发表于 2008-12-20 18:41:24 | 显示全部楼层
  1. @setlocal enabledelayedexpansion
  2. set %random%=%random%
  3. @echo off
  4. ::没有在开头使用是为了对比检验结果。完全可以移到首行
  5. for /l %%i in (0 1 32767) do (if defined %%i (set i=%%i)&goto next)
  6. :next
  7. ::这里使用一个跳转是为了节约CPU资源,不直接跳转是为了防止出错。
  8. echo 随机变量为:%i%
  9. echo 其值为:!%i%!
  10. set num=0
  11. set b=%i%
  12. set c=!%i%!
  13. for /l %%a in (0 1 4) do (
  14. set /a num+=!b:~%%a,1!
  15. set /a num+=!c:~%%a,1!
  16. )
  17. echo 各位数的和为:%num%
  18. pause>nul
复制代码

试验后发现位数不足五位时会有错误提示,修改屏蔽提示。
  1. @setlocal enabledelayedexpansion
  2. set %random%=%random%
  3. @echo off
  4. for /l %%i in (0 1 32767) do (if defined %%i (set i=%%i)&goto next)
  5. :next
  6. echo 随机变量为:%i%
  7. echo 其值为:!%i%!
  8. set num=0
  9. set b=%i%
  10. set c=!%i%!
  11. for /l %%a in (0 1 4) do (
  12. set /a num+=!b:~%%a,1! 2>nul
  13. set /a num+=!c:~%%a,1! 2>nul
  14. )
  15. echo 各位数的和为:%num%
  16. pause>nul
复制代码

[ 本帖最后由 firewolf85 于 2008-12-20 19:11 编辑 ]

评分

参与人数 1PB +8 收起 理由
wxcute + 8 不错,是新方法

查看全部评分

发表于 2009-1-21 11:43:51 | 显示全部楼层
学习一下,厉害啊………………!
发表于 2009-1-23 21:26:36 | 显示全部楼层

寻找随机数代码

@echo off&setlocal enabledelayedexpansion
:: 分两部分求和,是个笨方法
set %random%=%random%
set/a a=%random%&echo 随机值为:!a!
set/a b=%random%&echo 其值为:!b!
echo/&echo -----------
echo %a%=%b%
echo -----------
for /f %%i in ("%a%%b%") do (
set/a a=%%i
set/a b=%%i
set/a a0=%a:~0,1%
set/a a1=%a:~1,1% 2>nul&set/a a1+=!a0!
set/a a2=%a:~2,1% 2>nul&set/a a2+=!a1!
set/a a3=%a:~3,1% 2>nul&set/a a3+=!a2!
set/a a4=%a:~4,1% 2>nul&set/a a4+=!a3!
set/a b0=%b:~0,1%
set/a b1=%b:~1,1% 2>nul&set/a b1+=!b0!
set/a b2=%b:~2,1% 2>nul&set/a b2+=!b1!
set/a b3=%b:~3,1% 2>nul&set/a b3+=!b2!
set/a b4=%b:~4,1% 2>nul&set/a b4+=!b3!
)
set/a b4+=%a4%
echo 和为:%b4%
pause>nul

[ 本帖最后由 jadych 于 2009-1-23 22:00 编辑 ]
 楼主| 发表于 2009-1-24 09:30:06 | 显示全部楼层

回复 10楼 的帖子

这个方法是不对的,因为 RANDOM 是在不断变化中的。
可用 set 命令检验。
发表于 2009-1-24 21:51:44 | 显示全部楼层

回复

对代码改动了下,谢谢楼主大哥指出的错误,对随机数概念认识不足。问楼主个问题,二楼代码中:set /p==!s!<nul这句如何解释?另对下面代码中逐个数字截取并相加那段代码能不能用简化代码来实现?
@echo&setlocal enabledelayedexpansion
set %random%=%random%
for /f "delims=" %%i in ('set') do set num=%%i&call echo %%num%%&goto be
:be
for /f "tokens=1,2 delims==" %%j in ("%num%") do (
set/a a=%%j
set/a b=%%k
)
for /f %%l in ("%a%%b%") do (
set/a a=%%l
set/a b=%%l
set/a a0=%a:~0,1%
set/a a1=%a:~1,1% 2>nul&set/a a1+=!a0!
set/a a2=%a:~2,1% 2>nul&set/a a2+=!a1!
set/a a3=%a:~3,1% 2>nul&set/a a3+=!a2!
set/a a4=%a:~4,1% 2>nul&set/a a4+=!a3!
set/a b0=%b:~0,1%
set/a b1=%b:~1,1% 2>nul&set/a b1+=!b0!
set/a b2=%b:~2,1% 2>nul&set/a b2+=!b1!
set/a b3=%b:~3,1% 2>nul&set/a b3+=!b2!
set/a b4=%b:~4,1% 2>nul&set/a b4+=!b3!
)
set/a b4+=%a4%
echo 和为:%b4%
pause>nul

评分

参与人数 1PB +5 收起 理由
wxcute + 5 不错,牛年牛气。 请注意格式:http://bbs ...

查看全部评分

 楼主| 发表于 2009-1-25 11:12:15 | 显示全部楼层

回复 12楼 的帖子

第一个问题参考:
http://bbs.bathome.net/viewthread.php?tid=57
set 命令使用 详解(2007-11-11日更新)
http://bbs.bathome.net/viewthread.php?tid=1940
set /p=<nul是什么意思??
http://bbs.bathome.net/thread-2646-1-2.html
请问>nul和<nul各有什么作用啊

二、简化方法提供 2 个思路罢
  1空格隔开数字用最原始的 FOR 语句做加法
  2利用除法与取余运算一次性算出,因为随机数位数是有限制的
发表于 2009-1-25 22:32:15 | 显示全部楼层

随机加点,不知道批处理可以实现吗?

谢谢收藏了
发表于 2009-2-5 21:37:42 | 显示全部楼层
  1. @echo off
  2. :back
  3. setlocal enabledelayedexpansion
  4. set %random%=%random%
  5. set /a man=1
  6. set /a men=1
  7. set /a num1=0
  8. set /a num2=0
  9. for /F "delims=" %%n IN ('set') DO (
  10. if !man! EQU 1 (set flog=%%n)
  11. set man=!man!+1
  12. )
  13. for /f "delims== tokens=1,2" %%i in ("%flog%") do (
  14. set ax1=%%i
  15. set ax2=%%j
  16. )
  17. for /l %%a in (0 1 4) do (
  18. set /a num1=!num1!+!ax1:~%%a,1! 2>nul
  19. set /a num2=!num2!+!ax2:~%%a,1! 2>nul
  20. )
  21. if %num1% EQU %num2% goto end
  22. endlocal
  23. goto back
  24. :end
  25. echo %ax1% and %ax2% are all %num1%
  26. pause > nul
复制代码
研究时发现这个变量永远在set的第一行,因为set中的系统变量没有数字开头的,于是乎我偷懒了

评分

参与人数 1PB +4 收起 理由
wxcute + 4 计算的次数过多。

查看全部评分

发表于 2009-2-19 21:12:53 | 显示全部楼层

试试

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a a=%random%
  4. set /a b=%random%
  5. echo %a%=%b%
  6. for /l %%i in (0,1,4) do (
  7. set /a c1=c1+!a:~%%i,1!
  8. set /a c2=c2+!b:~%%i,1! )
  9. set /a c=c1+c2
  10. echo %c%
  11. pause>nul
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 02:47 , Processed in 0.024331 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表