标题: [其他] 批处理如何随机获得一个英文字母? [打印本页]
作者: 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 指出了我的错误- @echo off & setlocal enableDelayedExpansion
- for /f "tokens=1-2" %%a in ("%random:~0,2% asdfghjklqwertyuiopzxcvbnm") do set %%b=%%b%%b&echo !%%b:~%%a,1!
- 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
楼上恐怕不妥吧。。。- @echo off
- set str=abcdefghijklmnopqrstuvwxyz
- set /a rnd=%random%%%26
- call echo %%str:~%rnd%,1%%
- 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
给段代码:
- @echo off & mode con cols=60 lines=13 & color 0a & title 随机取数字或字母
- set word=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890
- set /p p=请输入您要取几个?
- if %p% geq 50 echo 正在操作,请稍后......
- ::=============循环首
- :start
- set /a ss+=1
- set /a a=%random%%%61
- call set c=%%word:~%a%,1%%
- set end=%end%%c%
- if %ss% lss %p% goto start
- ::=============循环尾
- cls
- echo %end%
- echo %end%>>temp.txt
- 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 楼
举一例说明:- @echo off & setlocal enableDelayedExpansion
- set i=0
- for /f %%a in ('more +11 ^<%~s0') do (
- set str!i!=%%a
- set /a i+=1
- )
- for /l %%a in (0 0 0) do (
- set /a i=!random! %% 7
- call echo %%str!i!%%
- pause
- )
- apple
- windows
- choocolate
- banana
- love
- smoking
- mountain
-
-
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |