|
|
发表于 2010-7-18 12:12:19
|
显示全部楼层
有问题的代码, 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 编辑 ] |
|