[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-015】批处理随机取值练习

出题目的:
        掌握利用random进行随机取值技巧
解题要求:
        代码通用、高效
        尽量简洁
        尽量不生成临时文件
加分规则:
        1 思路独特基准分5分
        2 代码高效、通用基准分4分
        3 技巧高超基准分3分
        4 代码简洁基准分2分
        5 完美代码加分15分
题目如下:
  已知有1-26与a-z的一一对应,如1对应a 10对应j 26对应z,要求用批处理
从1-26 a-z这52个值中(全视为值)随机抽取10个互不相同的值并显示出来,
注意如同1和a 24和x 26和z这样的取值均视为相同不合要求。      
解题限制:
        暂无限制。
------------------------------------------------------------------------------------------------
目前的最佳答案见:16楼本人的解

[ 本帖最后由 batman 于 2008-8-30 13:10 编辑 ]
***共同提高***

楼上的代码写得复杂且效率低,但答案还是对的,加分鼓励。
***共同提高***

TOP

&&pusofalse版主代码已经比较完美了,就是在效率上还存在一点小问题,其实对于这种
随机取值的问题在取值基数和取值个数差值较大时(如从1-100中随机取10个不同的数)
使用if判断返回还是可以的,但一旦取值基数和取值个数差值小甚至为0时(如从1-100中
随机取100个不同的数)这种方法就解决不了问题了,所以对于此类问题个人建议使用乱序
来进行处理,下面就以从1-100中随机取100个不同的数为例给出代码:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1,1,100) do set "_!random!!random!!random!!random!=%%i"
  3. for /f "tokens=2 delims==" %%i in ('set _') do set /p=%%i <nul
  4. pause>nul
复制代码
2

评分人数

    • more: 好东西!!!PB + 10
    • pusofalse: 学习了!受益匪浅!技术 + 6
***共同提高***

TOP

原帖由 523066680 于 2008-8-25 15:34 发表
各位也都发表啦,我的也放出来啦 偶的还是原来的样子@echo off&setlocal enabledelayedexpansion
set /a a=0,act=0
for %%a 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 a+=1
set  ...

必须要指出你的问题了:
  代码书写极不规范,基本忽略了代码的可阅读性和美观性,在充分发挥兄弟的特长的基础上还请在这方面多下点功夫。。。
***共同提高***

TOP

下面给出本人的解:

  1. @echo off&setlocal enabledelayedexpansion
  2. 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 (
  3.      set /a n+=1,a=!random!%%2
  4.      if !a! equ 0 (
  5.         set "_!random!!random!!random!=%%i"
  6.         ) else (
  7.         set "_!random!!random!!random!=!n!"
  8.      )
  9. )
  10. for /f "tokens=2 delims==" %%i in ('set _') do (
  11.      set /a n-=1
  12.      if !n! equ 15 pause>nul&goto :eof
  13.      set /p=%%i <nul
  14. )
复制代码

[ 本帖最后由 batman 于 2008-8-26 12:13 编辑 ]
2

评分人数

    • 随风: 确实妙的很,赞! + 1
    • more: 妙!!!PB + 10 技术 + 5
***共同提高***

TOP

楼上没考虑重复的情况?
***共同提高***

TOP

原帖由 mkl 于 2008-8-28 21:20 发表

请问 set_ 是什么意思?还有那个 set "_!random!!random!!random!=%%i 呢?

请在我的代码的第一个for循环后加入一个set _运行看看,其实set _就是显示所有以_字符
打头的变量,具体可在cmd中键入set /?查询。
***共同提高***

TOP

楼上会存在效率问题,特别是用到了||管道符。

[ 本帖最后由 batman 于 2009-5-2 20:03 编辑 ]
***共同提高***

TOP

返回列表