中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-22 12:23
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 随机显示5个不同的数 查看 6,589 回复 57
16 发表于 2007-01-05 07:07 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  发现了一个不可思议的现象:如果在6楼代码首尾的合适位置添加跳转语句和接收标签,从而使代码循环执行的话,则执行到第20次之后,就会只出现前4个数值,然后程序开始在 :loop 和 if %count% lss 5 goto loop 这个循环体内疯狂运行,第5个数值一直不能出现。嘿嘿,怪事。

————————————————————————————————
  原因分析请看41楼,解决问题的代码请看42楼。

[ Last edited by namejm on 2007-1-6 at 04:58 PM ]
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
17 发表于 2007-01-05 07:18 ·  中国 山东 济南 电信
社区乞丐
★★
此图片另存后死机
积分 -49
发帖 90
注册 2006-12-02 13:00
19年会员
UID 72412
性别 男
状态 离线
没什么好奇怪的,你没加 setlocal

13楼的代码已经可以解决问题了只是还有

请问 namejm 老师

%random%%%99

是什么意思啊???

[ Last edited by tghksj on 2007-1-4 at 06:26 PM ]
我的网络笔记本.非联系本人请勿访问!http://w.vicp.net
18 发表于 2007-01-05 07:27 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  表示用一个随机数除以99,然后取余数,也就是数学上所说的模运算。

  13楼的代码确实不会出现重复值,但是,要出现一位数的几率就太小了,简直是千年等一回呢^_^。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
19 发表于 2007-01-05 07:35 ·  中国 广东 清远 联通
高级用户
★★
积分 846
发帖 247
注册 2006-10-27 12:03
19年会员
UID 68504
性别 男
来自 湖南==》广东
状态 离线
Originally posted by namejm at 2007-1-5 02:16 AM:
  看了4楼的代码,推测 youxi01 的本意是想显示5个 1-100 之间(不包含100)不同的随机数,但是代码是有问题的:%a% 是 1-5 的数,用 if not defined 来判断 n ...


我要的效果就是要它没有定义过,要是定义过了,那不就重复了嘛!
20 发表于 2007-01-05 07:36 ·  中国 山东 济南 电信
社区乞丐
★★
此图片另存后死机
积分 -49
发帖 90
注册 2006-12-02 13:00
19年会员
UID 72412
性别 男
状态 离线
谢谢老师的说明.

13楼只有当 %random% LSS 10 的时候才会有 1位数 呵呵 几率确实很小的.

6楼的代码确实不知道什么原因......

多次执行之后就不能使用了????!!

%count% 永远==0了...????奇怪哦

清空count 后 setlocal 也不管用了...纳闷....

等高人解释一下了......

[ Last edited by tghksj on 2007-1-4 at 06:39 PM ]
我的网络笔记本.非联系本人请勿访问!http://w.vicp.net
21 发表于 2007-01-05 07:57 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
Originally posted by youxi01 at 2007-1-4 18:35:


我要的效果就是要它没有定义过,要是定义过了,那不就重复了嘛!

  实际上,if not defined !_num%a%! 这一句始终为真,也就是说,这一部分语句有和没有的效果是一样的,并不能控制那个变量是否已经被定义过,你添加跳转语句来循环执行,多次执行之后,就会看到有重复的数值出现了。可能你还不太明白我为什么说那一句始终为真,索性再多说几句吧:你在上一句用了 set /a _num!a!=%random:~-2% 来定义变量 _num!a!,下一句你用 if not defined !_num%a%! 来判断的是 变量_num!a! 的值(而非变量本身) 是否被定义。

   另外,你的代码并没有处理 08 和 09 ,会出错的。

[ Last edited by namejm on 2007-1-4 at 07:16 PM ]
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
22 发表于 2007-01-05 08:02 ·  中国 福建 福州 连江县 电信
中级用户
★★
积分 356
发帖 115
注册 2004-07-27 00:00
21年会员
UID 29114
性别 男
状态 离线
复杂的事交给电脑去做。我来个简单的。
@echo off
:loop
set s1=%RANDOM:~-2%
set s2=%RANDOM:~-2%
set s3=%RANDOM:~-2%
set s4=%RANDOM:~-2%
set s5=%RANDOM:~-2%
set /a h=s1*s2*s3*s4*s5*(s1-s2)*(s1-s3)*(s1-s4)*(s1-s5)*(s2-s3)*(s2-s4)*(s2-s5)*(s3-s4)*(s3-s5)*(s4-s5)
if h equ 0 goto :loop
echo %s1% %s2% %s3% %s4% %s5%
pause
goto :loop
23 发表于 2007-01-05 08:02 ·  中国 北京 朝阳区 联通
高级用户
★★
朦胧的世界
积分 579
发帖 218
注册 2006-10-24 04:29
19年会员
UID 67972
状态 离线
13楼的代码可以简化一下.

@ECHO OFF
setlocal ENABLEDELAYEDEXPANSION
SET T=1

:PR
FOR /L %%A IN (%T%,1,100) DO (
SET/a NO%%A=!random!%%100+1
SET /A H=%%A-1
FOR /L %%B IN (!H!,-1,1) DO (
IF !NO%%A!==!NO%%B! (SET T=%%A&GOTO PR))
echo !NO%%A!>>222.txt)
pause


批处理对CALL和FOR的嵌套执行效率并不高,能不用最好不用.

@echo off&setlocal enabledelayedexpansion
set t=1
:PR
for /l %%a in (%t% 1 100) do (
set/a a%%a=!random!%%100+1
if not defined !a%%a! (echo !a%%a!>>123.txt) else set t=%%a&goto PR
set !a%%a!=flag
)
pause

认识自己,降伏自己,改变自己
,才能改变别人!
24 发表于 2007-01-05 08:08 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  22楼通过几个数字相减是否为0来判断数字是否重复,确实是个思路,只是仍然没有处理好把字符串数值化的细节,导致截取到形如 02、03 的字符串(而非数值)。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
25 发表于 2007-01-05 08:21 ·  中国 广东 清远 联通
高级用户
★★
积分 846
发帖 247
注册 2006-10-27 12:03
19年会员
UID 68504
性别 男
来自 湖南==》广东
状态 离线
Originally posted by namejm at 2007-1-5 07:57 AM:

  实际上,if not defined !_num%a%! 这一句始终为真,也就是说,这一部分语句有和没有的效果是一样的,并不能控制那个变量是否已经被定义过,你淠...


明白了,还真的是笨,哈哈,不好意思!
26 发表于 2007-01-05 09:12 ·  中国 福建 福州 连江县 电信
中级用户
★★
积分 356
发帖 115
注册 2004-07-27 00:00
21年会员
UID 29114
性别 男
状态 离线
Originally posted by namejm at 2007-1-5 08:08 AM:
  22楼通过几个数字相减是否为0来判断数字是否重复,确实是个思路,只是仍然没有处理好把字符串数值化的细节,导致截取到形如 02、03 的字符串 ...

多谢指教,修改如下:
@echo off
:loop
set s1=%RANDOM:~-2%
set /a s1=s1*1
set s2=%RANDOM:~-2%
set /a s2=s2*1
set s3=%RANDOM:~-2%
set /a s3=s3*1
set s4=%RANDOM:~-2%
set /a s4=s4*1
set s5=%RANDOM:~-2%
set /a s5=s5*1
set /a h=s1*s2*s3*s4*s5*(s1-s2)*(s1-s3)*(s1-s4)*(s1-s5)*(s2-s3)*(s2-s4)*(s2-s5)*(s3-s4)*(s3-s5)*(s4-s5)
if %h% EQU 0 goto :loop
echo %s1% %s2% %s3% %s4% %s5%
pause
goto :loop
27 发表于 2007-01-05 09:51 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
请问斑主,你6楼的代码中红字部分是什么意识?
@echo off
set count=0

:loop
set /a num=%random%%%99+1
if not defined num%num% (
set num%num%=%num%
set /a count+=1
call echo %%num%%
)
if %count% lss 5 goto loop

pause>nul
28 发表于 2007-01-05 10:04 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  楼主你终于来了啊,可把大家想坏了。盼星星盼月亮,终于把你盼到了,总算在顶楼把意思表达清楚了,看来大家的猜测还不算离谱,呵呵。

  玩笑过后,言归正传。defined 的词义是定义的意思,在批处理中,用 if defined 变量名 这样的语句来检测某个变量是否已经被定义过(也就是有没有被赋值)。既然你要在1-100(包括1和100)这个范围内显示随机数,把我那个代码里的99改为100就可以了。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
29 发表于 2007-01-05 10:12 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
谢谢版主的解答,不过你好像又在21楼推翻了自己的方法,(21楼的解释我没看的太懂)那么你6楼的方法到底行不行呢?我试过好几次了,好像还行.
30 发表于 2007-01-05 10:27 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  4楼的思路是正确的,我在21楼只是指出了4楼代码的错误之处而已,而6楼的代码修正了那些错误,并没有推翻我的方法。

  另外,我在16楼描述了一个奇怪的现象,可能是call语句的特殊之处,也可能是CMD的一个bug,我现在都还没搞明白是怎么回事,希望能引起你的重视。

——————————————————————————————————————
  原因已经找到,请看41楼的分析,然后再使用42楼的代码。

[ Last edited by namejm on 2007-1-6 at 05:08 PM ]
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
论坛跳转: