Board logo

标题: [其他] 批处理如何随机获得一个英文字母? [打印本页]

作者: a281346230    时间: 2010-7-18 11:13     标题: 批处理如何随机获得一个英文字母?

本帖最后由 pcl_test 于 2016-11-21 23:40 编辑

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

谢谢

还有一个问题就是:“ for /f "delims="  “ 这个delims=空,不是分割的类型或者其他的,他要是等于"delims=;"我还能理解,但是这条就不能了“ for /f "delims="
作者: neorobin    时间: 2010-7-18 12:12

有问题的代码, 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 编辑 ]
作者: defanive    时间: 2010-7-18 23:30

楼上恐怕不妥吧。。。
  1. @echo off
  2. set str=abcdefghijklmnopqrstuvwxyz
  3. set /a rnd=%random%%%26
  4. call echo %%str:~%rnd%,1%%
  5. pause
复制代码

作者: a281346230    时间: 2010-7-19 11:54

楼上的朋友
set /a rnd=%random%%%26 这句 %%26代表什么意思啊?
call echo 随机生成的字母为:%%str:~%rnd%,2%%什么意思  解释下啊

[ 本帖最后由 a281346230 于 2010-7-19 11:56 编辑 ]
作者: hfg1977    时间: 2010-7-19 13:23

原帖由 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开始计数
作者: defanive    时间: 2010-7-19 18:31     标题: 回复 2楼 的帖子

如果随机数的值是5000呢?
多运行几次你的批处理,总会有显示不出的时候。。。
作者: poxi    时间: 2010-7-19 18:47

给段代码:
  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
复制代码


看得懂么....?
作者: neorobin    时间: 2010-7-20 17:13     标题: 回复 6楼 的帖子

忽然想起, 确实是存在问题的, %random:~0,2% 的范围应是 0--99, 那么确实如你所言, 总有不输出字母的时候, set %%b=%%b%%b%%b%%b, 这样, 26*4=104, 再不会有无输出的情况了, 不过也无大的新意, 不作也罢
作者: 雨夜秋风    时间: 2010-7-20 20:06     标题: 回复 8楼 的帖子

假如是多个字符串怎样才可以随机显示的呢?
作者: neorobin    时间: 2010-7-20 22:17     标题: 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
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2