中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-09 15:55
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 出给新手的加分题-随机取值 查看 2,074 回复 24
16 不为分数,给新人提供一个参考 发表于 2008-08-25 14:31 ·  中国 广西 百色 中移铁通
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线

@echo off
Setlocal Enabledelayedexpansion
set "var1=a b c d e f g h i j k l m n o p q r s t u v w x y z"
for /l %%a in (1 1 26) do (set "var2=!var2!%%a ")
for %%a in (%var1%) do (set /a "nn+=1"&set "!nn!=%%a"&set "%%a=!nn!")
echo %var1%&echo %var2%&echo.
:lp
set /a "bt=%random%%%26+1","aa=%random%%%2+1"
for /f "tokens=%bt%" %%a in ("!var%aa%!") do (
if defined .%%a goto :lp
if defined .!%%a! goto :lp
set "ech=!ech! %%a"
set ".%%a=ok"&set ".!%%a!=ok"
)
set /a mm+=1
if %mm% lss 10 goto :lp
echo %ech%
for %%a in (%var1%) do (set ".%%a="&set ".!%%a!=")
set "mm=0"&set "ech="
pause>nul&goto :lp


[ Last edited by moniuming on 2008-8-25 at 02:33 PM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
bat-zw +8 2008-08-25 16:46
17 发表于 2008-08-25 16:35 ·  中国 广东 江门 电信
中级用户
★★
积分 338
发帖 175
注册 2007-10-21 15:30
18年会员
UID 100351
性别 男
状态 离线
谢谢前辈指点。。。
会去研究研究...
18 发表于 2008-08-25 16:48 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
16楼的代码使用了if判断返回,因此在一定意义上存在效率问题,代码也较为复杂,但还是予以加分鼓励了。
批处理之家新域名:www.bathome.net
19 发表于 2008-08-25 16:58 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
下面给出本人的解:

@echo off&setlocal enabledelayedexpansion
for %%i in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
set /a n+=1,a=!random!%%2
if !a! equ 0 (
set "_!random!!random!!random!=!n!"
) else (
set "_!random!!random!!random!=%%i"
)
)
for /f "tokens=2 delims==" %%i in ('set _') do (
set /a n-=1
if !n! equ 15 pause>nul&goto :eof
set /p=%%i <nul
)
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
moniuming +8 2008-08-26 18:54
批处理之家新域名:www.bathome.net
20 发表于 2008-08-25 20:03 ·  中国 广东 江门 电信
中级用户
★★
积分 338
发帖 175
注册 2007-10-21 15:30
18年会员
UID 100351
性别 男
状态 离线
zw兄的代码真厉害...

能够写下注释吗?
能够讲解下思路是如何吗?

[ Last edited by BC on 2008-8-25 at 08:07 PM ]
21 发表于 2008-08-25 23:16 ·  中国 云南 昆明 电信
中级用户
★★
积分 220
发帖 99
注册 2008-06-26 15:12
18年会员
UID 120818
性别 男
状态 离线
斑竹大哥能讲解一下
set "_!random!!random!!random!=!n!"
) else (
set "_!random!!random!!random!=%%i"

三个随机数连在一起是什么意思啊?
22 发表于 2008-08-26 13:08 ·  中国 四川 泸州 电信
初级用户
积分 30
发帖 18
注册 2008-05-11 01:43
18年会员
UID 118377
性别 男
状态 离线
我是新手啊,不过我做了,意思完全符合题目要求!大家看看!
@echo off&setlocal enabledelayedexpansion
set char1=abcdefghijklmnopqrstuvwxyz
set char3=1
set num=0
:loop
set /a ran=%random%%%26
set char2=!char1:~%ran%,1!
set /a num1=%ran%+1
if %num% lss 10 (
echo %char3%|find "%char2%" 1>nul
if errorlevel 1 ( set char3=%char3%%char2%&echo %num1%--%char2%&set /a num+=1&goto loop ) else ( goto loop ) )
pause
23 发表于 2008-08-26 13:24 ·  中国 广东 深圳 电信
初级用户
积分 59
发帖 28
注册 2007-03-23 05:18
19年会员
UID 82622
性别 男
状态 离线
望楼主分析一下高深的代码。
24 发表于 2008-08-26 14:34 ·  中国 四川 泸州 电信
初级用户
积分 30
发帖 18
注册 2008-05-11 01:43
18年会员
UID 118377
性别 男
状态 离线
@echo off&setlocal enabledelayedexpansion
set char1=abcdefghijklmnopqrstuvwxyz
set char3=1
set num=0
:loop
set /a ran=%random%%%26-------这句设置0--25 随机数字
set char2=!char1:~%ran%,1!-------这句取得随机数字所对应的字幕,比如随机数字5,那么对应的就是f,因为0对应与a
set /a num1=%ran%+1------这句是随机数字+1 这主要用后面的输出 1对应与a 作用
if %num% lss 10 ( -------这句是循环 循环10次
echo %char3%|find "%char2%" 1>nul -----这句判断这个随机数字是否已经产生过
if errorlevel 1 ( set char3=%char3%%char2%&echo %num1%--%char2%&set /a num+=1&goto loop ) else ( goto loop ) ) -------这句是接上句,如果曾经产生过这个随机数字,继续循环下一次,如果没有产生过,则循环计数+1,然后输出对应的数字和字母,然后在进行循环,这样可以去掉上次随机产生1,这次随机还是产生1这种情况,这样解析应该都理解了吧
pause
25 发表于 2008-08-26 16:13 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
&&楼上兄弟的态度还是很认真的,值得称赞,但你的代码是不合题意的:
一、你生成的是一个对应关系,而这个对应关系本就是题目中事先给出的条件,并不需要再去生成;
二、根据你的代码只能生成10个互不同的纯数列或纯字母列,而题意是要求生成字母和数字组成并彼此间不存在对应关系的随机值列;
三、和前面其他的代码一样使用if判断+返回(在你的代码中表现为不累加计数),存在效率问题;
四、使用管道也降低了代码效率。
批处理之家新域名:www.bathome.net
论坛跳转: