找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 30174|回复: 9

[其他] 批处理如何随机获得一个英文字母?

[复制链接]
发表于 2010-7-18 11:13:22 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-11-21 23:40 编辑

就比如 %random%是批处理的内置对象可以随机数字
但是如何随机英文字母呢?

谢谢

还有一个问题就是:“ for /f "delims="  “ 这个delims=空,不是分割的类型或者其他的,他要是等于"delims=;"我还能理解,但是这条就不能了“ for /f "delims="
发表于 2010-7-18 12:12:19 | 显示全部楼层
有问题的代码, defanive 指出了我的错误
  1. @echo off & setlocal enableDelayedExpansion
  2. for /f "tokens=1-2" %%a in ("%random:~0,2% asdfghjklqwertyuiopzxcvbnm") do set %%b=%%b%%b&echo !%%b:~%%a,1!
  3. pause
复制代码
%random% 的随机数范围是 [0,32767], %random:~0,2% 是取随机数的左两位, 当随机数结果 >= 10 时, 很好理解, 最终结果是 [10,32], 当随机数结果不足两位时, 在 WINXP SP3 环境下, 也不会出错, %random:~0,2% 就只会取最前一位, 也就是 [0,9], 综而言之, 最终结果在 [0,32] 区间, 以 asdfghjklqwertyuiopzxcvbnm 为名的变量其结果是名称的双写, 共有26*2=52 个字符, 前 26 位即包含了所有的字母, 故最终结果是可以输出任意一个字母的.

机率方面, 本来机器的随机数发生就是一种 "伪随机数", 也不保证机率平均化, 不出现严重的机率不平衡, 也就可以了

实测了一下 %random:~0,2% 得到 1 位数的机率相当小, 万分之几, 所以这种方式确实不好。
一般的做法还是

!random! 对 n+1 求余(n 为正整数)来得到 [0,n] 范围内的随机数

p < q 时
!random! %% (q-p+1) + p 来得到 [p,q] 范围内的随机数


[ 本帖最后由 neorobin 于 2010-7-20 22:01 编辑 ]
发表于 2010-7-18 23:30:55 | 显示全部楼层
楼上恐怕不妥吧。。。
  1. @echo off
  2. set str=abcdefghijklmnopqrstuvwxyz
  3. set /a rnd=%random%%%26
  4. call echo %%str:~%rnd%,1%%
  5. pause
复制代码
 楼主| 发表于 2010-7-19 11:54:19 | 显示全部楼层
楼上的朋友
set /a rnd=%random%%%26 这句 %%26代表什么意思啊?
call echo 随机生成的字母为:%%str:~%rnd%,2%%什么意思  解释下啊

[ 本帖最后由 a281346230 于 2010-7-19 11:56 编辑 ]
发表于 2010-7-19 13:23:35 | 显示全部楼层
原帖由 defanive 于 2010-7-18 23:30 发表
echo off
set str=abcdefghijklmnopqrstuvwxyz
set /a rnd=%random%%%26
call echo %%str:~%rnd%,1%%
pause


set /a rnd=%random%%%26  //生成随机数 0~25

call echo %%str:~%rnd%,1%% //取0~25位开始的第一个字母,从0开始计数
发表于 2010-7-19 18:31:58 | 显示全部楼层

回复 2楼 的帖子

如果随机数的值是5000呢?
多运行几次你的批处理,总会有显示不出的时候。。。
发表于 2010-7-19 18:47:34 | 显示全部楼层
给段代码:
  1. @echo off & mode con cols=60 lines=13 & color 0a & title 随机取数字或字母
  2. set word=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890
  3. set /p p=请输入您要取几个?
  4. if %p% geq 50 echo 正在操作,请稍后......
  5. ::=============循环首
  6. :start
  7. set /a ss+=1
  8. set /a a=%random%%%61
  9. call set c=%%word:~%a%,1%%
  10. set end=%end%%c%
  11. if %ss% lss %p% goto start
  12. ::=============循环尾
  13. cls
  14. echo %end%
  15. echo %end%>>temp.txt
  16. pause>nul
复制代码


看得懂么....?
发表于 2010-7-20 17:13:02 | 显示全部楼层

回复 6楼 的帖子

忽然想起, 确实是存在问题的, %random:~0,2% 的范围应是 0--99, 那么确实如你所言, 总有不输出字母的时候, set %%b=%%b%%b%%b%%b, 这样, 26*4=104, 再不会有无输出的情况了, 不过也无大的新意, 不作也罢
发表于 2010-7-20 20:06:41 | 显示全部楼层

回复 8楼 的帖子

假如是多个字符串怎样才可以随机显示的呢?
发表于 2010-7-20 22:17:44 | 显示全部楼层

Re 9 楼

举一例说明:
  1. @echo off & setlocal enableDelayedExpansion
  2. set i=0
  3. for /f %%a in ('more +11 ^<%~s0') do (
  4.   set str!i!=%%a
  5.   set /a i+=1
  6. )
  7. for /l %%a in (0 0 0) do (
  8.   set /a i=!random! %% 7
  9.   call echo %%str!i!%%
  10.   pause
  11. )
  12. apple
  13. windows
  14. choocolate
  15. banana
  16. love
  17. smoking
  18. mountain

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 12:58 , Processed in 0.018226 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表