中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何在指定的范围内显示随机数字
« [1] [2] »
作者:
标题: 如何在指定的范围内显示随机数字 上一主题 | 下一主题
khansky
新手上路





积分 12
发帖 4
注册 2007-10-29
状态 离线
『楼 主』:  如何在指定的范围内显示随机数字

如何在指定的范围内显示随机数字,比如我想随机显示的数字为(6,7,8,9,10,11,12,14,15,16,17)为其中的一个。用批处理怎么写,还请各位高人指点。谢谢!

2007-11-28 23:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 2 楼』:  


@echo off
:l
set rn=%random:~0,1%
set rr=%random:~0,2%

if %rn% geq 6 (
        if %rn% leq 9 (set n=1&echo %rn%&pause&exit /b)
)
if %rr% geq 10 (
        if %rr% leq 17 (set m=1&echo %rr%&pause&exit/b)
)

if not defined m goto :l
)

pause


2007-11-29 00:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 3 楼』:  


@echo off
set max=17
set min=6

set /a "a=%random%%%(%max%-%min%+1)+%min%"
echo %a%
pause
[ Last edited by dikex on 2007-11-29 at 12:30 AM ]

   此帖被 +15 点积分         点击查看详情   
评分人:【 everest79 分数: +15  时间:2007-11-29 13:50




正在潜水修练的批处理小白
2007-11-29 00:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 4 楼』:  

LS的注意,LZ的数字里面没有13,如果是n~m范围就OK,如果是指定数就不行了
需要的数字用空格分隔
@echo off
setlocal EnableDelayedExpansion

set "str=6 7 8 9 10 11 12 14 15 16 17"

set min=m
set max=0
for %%n in (%str%) do (
  if %%n lss !min! set min=%%n
  if %%n gtr !max! set max=%%n
)

:loop
cls
set /a n=%random%%%(%max%-%min%+1)+%min%
for %%n in (%str%) do if %n% == %%n goto end
goto loop

:end
echo %n%
pause
goto loop


   此帖被 +1 点积分    点击查看详情   
评分人:【 khansky 分数: +1  时间:2007-11-29 15:26




2007-11-29 00:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 5 楼』:  

呵呵,,我也没有仔细看~~
加一个判断就行了~~ 嘿嘿~~
再简化一下....
@echo off
:l
set rn=%random:~0,1%
set rr=%random:~0,2%

if %rn% geq 6 (
        if %rn% leq 9 (echo %rn%&pause&exit /b)
)
if %rr% geq 10 (
       if %rr% neq 13 ( if %rr% leq 17 (set m=1&echo %rr%&pause&exit/b) )
)

if not defined m goto :l
)

pause


2007-11-29 00:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 6 楼』:  

没看清楚,看到前面自然就以为是连续的,呵呵
写了另一个利用for的tokens参数的:
@echo off
set "string=6 7 8 9 10 11 12 14 15 16 17"
for %%i in (%string%) do call set /a "n=%%n%%+1"
set /a "tn=(%random%)%%(%n%)+1"
call :GET %tn%
pause
goto :EOF

:GET
for /f "usebackq tokens=%1 delims== " %%i in ('%string%') do echo %%i
goto :EOF




正在潜水修练的批处理小白
2007-11-29 01:29
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 7 楼』:  

好呢~~~呵呵 ...
我只是想到了就写,哈哈~~

ps:我睡觉了~

2007-11-29 02:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by dikex at 2007-11-29 01:29:
没看清楚,看到前面自然就以为是连续的,呵呵
写了另一个利用for的tokens参数的:
@echo off
set "string=6 7 8 9 10 11 12 14 15 16 17"
for %%i in  ...

简化:
@echo off
set "string=6 7 8 9 10 11 12 14 15 16 17"
for %%i in (%string%) do set /a n+=1
set /a "n=%random%%%%n%+1"
for /f "usebackq tokens=%n% delims= " %%i in ('%string%') do echo %%i
pause
goto :EOF


   此帖被 +1 点积分    点击查看详情   
评分人:【 khansky 分数: +1  时间:2007-11-29 15:25




2007-11-29 02:46
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 9 楼』:  

凑个热闹.
@echo off
set "string=6 7 8 9 10 11 12 14 15 16 17"
for %%a in (%string%) do call set _%%random%%=%%a
for /f "tokens=2 delims==" %%a in ('set _^|sort') do set var=%%a
echo %var%
pause




致精致简!
2007-11-29 04:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by zh159 at 2007-11-29 02:46 AM:

简化:
[code]@echo off
set "string=6 7 8 9 10 11 12 14 15 16 17"
for %%i in (%string%) do set /a n+=1
set /a "n=%random%%%%n%+1"
for /f "usebackq tokens=%n% delim ...

比较喜欢用call,这样看起来比较清楚,而且容易扩展;而%random%%%%n%这里加上两个括号也能让代码更清楚,一定程度上防止一些奇怪的错误发生:)



正在潜水修练的批处理小白
2007-11-29 12:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 11 楼』:  

引用三楼:
@echo off
:l
set /p max=请输入你想要的最大值:
set /p min=请输入你想要的最小值:

set /a "a=%random%%%(%max%-%min%+1)+%min%"
echo %a%
pause >nul&goto l

2007-11-29 13:40
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
khansky
新手上路





积分 12
发帖 4
注册 2007-10-29
状态 离线
『第 12 楼』:  

谢谢各位兄弟的帮忙。现在运行这些脚本有以下几点看法:1)。4楼的结果虽然是对的,但要一直循环。我的目的是随机给一个变量赋值为上面数值之一,然后对该变量执行相应的操作。2)5楼兄弟的有时没有输出任何结果,6,8楼的提示The system cannot find the file ,还有一串乱码。9楼的结果都是同一个,15。

还有想问问6,8楼兄弟tn=(%random%)%%(%n%)+1,中间的2个%怎么理解。还有set "string=6 7 8 9 10 11 12 14 15 16 17"的双引号为什么不是放在6的前面尼
?usebackq 现在网上的解释比较乱。还往各位高手赐教。谢谢~~

2007-11-29 15:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 13 楼』:  



  Quote:
Originally posted by khansky at 2007-11-29 15:22:
谢谢各位兄弟的帮忙。现在运行这些脚本有以下几点看法:1)。4楼的结果虽然是对的,但要一直循环。我的目的是随机给一个变量赋值为上面数值之 ...

你说9楼的每次都是 15 ??
你测试了没有啊?在我这里一切正常。每次都是随机数。
别人给你写了代码,你就应该好好测试,这是最起码的尊重吧?



致精致简!
2007-11-29 16:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 14 楼』:  



  Quote:
Originally posted by dikex at 2007-11-29 12:45:
比较喜欢用call,这样看起来比较清楚,而且容易扩展;而%random%%%%n%这里加上两个括号也能让代码更清楚,一定程度上防止一些奇怪的错误发生:)

不知道为什么,我执行后会出现:

  Quote:
系统找不到文件 D
C ˜ΐΐ。


for %%i in (%string%) do call set /a "n=%%n%%+1"
set /a "tn=(%random%)%%(%n%)+1"
改为
for %%i in (%string%) do set /a n+=1
set /a "tn=%random% %% %n%+1"
后就正常了
%random%%%%n%+1 改为 %random% %% %n%+1 也能看清楚
set/? 里只说明 % 为运算符号,没有详细说明,其实是两数相除后的余数命令行用一个 % ,批处理里用2个%

再将 8 楼的改一下
@echo off
set "string=6 7 8 9 10 11 12 14 15 16 17"
for %%i in (%string%) do set /a n+=1
set /a "n=%random% %% %n%+1"
for /f "tokens=%n% delims= " %%i in ("%string%") do echo %%i
pause
exit




2007-11-29 16:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 15 楼』:  



  Quote:
Originally posted by zh159 at 2007-11-29 04:06 PM:

不知道为什么,我执行后会出现:



for %%i in (%string%) do call set /a "n=%%n%%+1"
set /a "tn=(%random%)%%(%n%)+1"
改为
[code]for %%i i ...

我昨晚也出现过类似的情况,但是在打开了变量延迟而且string里面的数字数学多于4个的时候出现的;
现在我打开了变量延迟而且string里面的数字个数多于4个,但却不出错了……

[ Last edited by dikex on 2007-11-29 at 04:19 PM ]



正在潜水修练的批处理小白
2007-11-29 16:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: