标题: 出给新手的加分题-随机取值
[打印本页]
作者: bat-zw
时间: 2008-8-24 10:32
标题: 出给新手的加分题-随机取值
好久没有出过题了,今天来一出给新手的题,老手们还请略过了:
题目:
现有a-z和1-26的一一对应,现在要求用批处理从1-26和a-z 52个值
(全视为值)中随机取得10个不同的值,如1和a 26和z视为相同的值
要求:
代码高效、简洁、通用、并不生成临时文件
加分:
代码完全符合要求的加10分
作者: bat-zw
时间: 2008-8-24 14:29
看来现在是要代码的多,真的抱着学习目的来的少,唉。。。
作者: pusofalse
时间: 2008-8-24 14:58
感叹。。人气不盛。。
作者: dragonamd
时间: 2008-8-24 15:31
难度太大,理解不够,。吃不消,本人并不是为了代码而来
作者: dragonamd
时间: 2008-8-24 15:33
本人愚钝,真心拜师,喜欢收徒的来!
作者: 523066680
时间: 2008-8-24 16:26
真不好决策呢……虽然很想搬上来 但我算不算老手啊
作者: 523066680
时间: 2008-8-24 16:46
我再加一水贴,哎没办法 有一部分人都往bathome过渡哦
作者: holee
时间: 2008-8-24 17:54
感觉难度比较高啊。。。唉。。继续我的蜗牛学习之路。。
作者: kghong
时间: 2008-8-24 19:18
dos盲.有难度呀.慢慢来
作者: bat-zw
时间: 2008-8-24 19:29
提示:多在这个一一对应上做文章
作者: BC
时间: 2008-8-24 22:52
我晕,没想到那么难...
[
Last edited by BC on 2008-8-25 at 08:32 AM ]
作者: daker
时间: 2008-8-24 23:51
@echo off
setlocal EnableDelayedExpansion
set nu=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
set n=0
:_loop
if %n% geq 10 (goto _end)
set /a n=%n%+1
set /a unx=%random%%%26+1
for /f "tokens=%unx% delims= " %%i in ('echo %nu%')do echo %n% %%i %unx%
goto _loop
:_end
是这个样子???
还是set nu= a-z + 1-26
set unx=%random%%%52+1 ????
[
Last edited by daker on 2008-8-25 at 12:06 AM ]
作者: pusofalse
时间: 2008-8-25 01:21
楼主的意思是如果已经出现了3,就不能再出现3,不能出现c。
a-1 b-2 c-3。。。 都是一一对应的。
作者: BC
时间: 2008-8-25 08:53
@echo off
setlocal enabledelayedexpansion
set num=1234567890
set wor=abcdefghijklmnopqrstuvwxyz
:a1
set /a var1=%random%%%26+1
set /a var2=%random%%%9+1
if %var1% equ %var2% (goto :a1)
if %var1% lss 1 ( goto :a1 )
set key1=!wor:~%var1%,9!
set key2=!num:~%var2%,1!
echo %key1%%key2%
pause
搞了个很偷懒的方法,而且也不是很符合题意,但小弟的能力就是那么多。。。
希望有高人指点...
作者: qq152576450
时间: 2008-8-25 10:15
@echo off
Setlocal Enabledelayedexpansion
set _w=0abcdefghijklmnopqrstuvwxyz
set _p=0
for /l %%i in (1 1 26) do (set w%%i=!_w:~%%i,1!
set _w%%i=%%i)
:xz
set /a _p+=1
if %_p%==11 goto show
set /a xzx=%random%%%2
set /a xzp=%random%%%26+1
if %xzx%==0 set show%_p%=%xzp%
if %xzx%==1 set show%_p%=!w%xzp%!
goto xz
:show
for /l %%i in (1,1,10) do set /p =!show%%i! <nul
pause>nul
但不能判断是否重复....
望前辈指教
作者: moniuming
时间: 2008-8-25 14:31
标题: 不为分数,给新人提供一个参考
@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 ]
作者: BC
时间: 2008-8-25 16:35
谢谢前辈指点。。。
会去研究研究...
作者: bat-zw
时间: 2008-8-25 16:48
16楼的代码使用了if判断返回,因此在一定意义上存在效率问题,代码也较为复杂,但还是予以加分鼓励了。
作者: bat-zw
时间: 2008-8-25 16:58
下面给出本人的解:
@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
)
作者: BC
时间: 2008-8-25 20:03
zw兄的代码真厉害...
能够写下注释吗?
能够讲解下思路是如何吗?
[
Last edited by BC on 2008-8-25 at 08:07 PM ]
作者: 23112656
时间: 2008-8-25 23:16
斑竹大哥能讲解一下
set "_!random!!random!!random!=!n!"
) else (
set "_!random!!random!!random!=%%i"
三个随机数连在一起是什么意思啊?
作者: heheguai
时间: 2008-8-26 13:08
我是新手啊,不过我做了,意思完全符合题目要求!大家看看!
@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
作者: szww
时间: 2008-8-26 13:24
望楼主分析一下高深的代码。
作者: heheguai
时间: 2008-8-26 14:34
@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
作者: bat-zw
时间: 2008-8-26 16:13
&&楼上兄弟的态度还是很认真的,值得称赞,但你的代码是不合题意的:
一、你生成的是一个对应关系,而这个对应关系本就是题目中事先给出的条件,并不需要再去生成;
二、根据你的代码只能生成10个互不同的纯数列或纯字母列,而题意是要求生成字母和数字组成并彼此间不存在对应关系的随机值列;
三、和前面其他的代码一样使用if判断+返回(在你的代码中表现为不累加计数),存在效率问题;
四、使用管道也降低了代码效率。