标题: [数值计算] [已解决]求解释批处理 互不相同随机数生成 [打印本页]
作者: BHsolve 时间: 2013-12-30 17:09 标题: [已解决]求解释批处理 互不相同随机数生成
本帖最后由 BHsolve 于 2014-1-1 15:25 编辑
- @echo off&setlocal enabledelayedexpansion
- set "num=5"
- :begin
- set /a num-=1
- for /l %%i in (0,1,%num%) do (
- set /a a=!random!%%20
- if defined _!a! set /a num+=1&goto begin
- set /p=!a! <nul&set "_!a!=!a!"&goto begin
- )
- pause>nul
复制代码
代码如上,希望能一步一步讲解。先谢谢了
作者: DAIC 时间: 2013-12-30 21:31
哪里不懂就直接问吧
作者: BHsolve 时间: 2013-12-31 14:18
回复 2# DAIC
嗯,好的。
问题:第一次给_!a!赋值后,_!a!有定义了。那不就一直是begin到if间的死循环了?如何实现输出五个不同的随机数的
作者: DAIC 时间: 2013-12-31 17:24
回复 3# BHsolve
第六行会生产一个“随机”数字赋值给变量a,所以_!a!也会发生变化,不会造成死循环。
作者: BHsolve 时间: 2013-12-31 21:22
回复 4# DAIC
a变量被赋予新值这没问题,_!a!变量发生改变是 _!a! --> !a! -->!random!%%20 没有错吧
_!a!仍然有定义,但是值被改变了。
没有死循环也就是说,这样说defined这里判断的并不是有没有定义而是变量_!a!二次扩展后值一不一致?defined刷新环境变量,是在判定的变量更新时?
作者: DAIC 时间: 2014-1-1 11:26
回复 5# BHsolve
是的,defined也只是一个普通的命令而已,一般都是先进行变量扩展/替换,然后执行命令。
作者: BHsolve 时间: 2014-1-1 12:38
回复 6# DAIC
昨天好像理解的不是很到位
今天看了""扩起来好像是说不转义 ! %
假设:!a!被赋值为5 _!a!=!a! 其实就是_5=5
下次的循环中如果!a!变为6
变量_5没有变化还是有定义 而_!a!因为变量延迟变成_6自然就没有定义
这样理解才对吧
作者: PowerShell 时间: 2014-1-1 13:05
从1----10000的数字中,随机选取5个不重复的随机数,赋值给变量aaa
powershell代码- $aaa = 1..10000 | Get-Random -Count 5
复制代码
作者: DAIC 时间: 2014-1-1 13:10
回复 7# BHsolve
对
作者: apang 时间: 2014-1-1 14:17
楼主还在纠结,偶来码码字,看楼主能否明白:- @echo off&setlocal enabledelayedexpansion
- set "num=5"
- :begin
- set /a num-=1
- for /l %%i in (0,1,%num%) do (
- set /a a=!random!%%20
- if defined _!a! set /a num+=1&goto begin
- set /p=!a! <nul&set "_!a!=!a!"&goto begin
- )
- pause>nul
复制代码
第一次循环,Num自减1,变成4,for语句就是:for /l %%i in (0 1 4) do ...
假设变量a值为15,因为变量_15未定义,第7行if条件不成立,if后面的语句不会执行;
执行到第8行,将变量_15赋值为15,此时屏显:15
再跳转到 :begin
第二次循环,Num的值变成3,for语句就是:for /l %%i in (0 1 3) do ...
假设a值仍为15,因为变量_15在第一次循环时已定义,执行第7行语句,Num自加1,变成4。
再跳转到 :begin,不执行第8行
第三次循环,Num的值变成3,for语句就是:for /l %%i in (0 1 3) do ...
假设a值为14,因为变量_14未定义,第7行if条件不成立,if后面的语句不会执行;
执行到第8行,将变量_14赋值为14,此时屏显:15 14
再跳转到 :begin
第四次循环,Num的值变成2,for语句就是:for /l %%i in (0 1 2) do ...
假设a值为13,因为变量_13未定义,第7行if条件不成立,if后面的语句不会执行;
执行到第8行,将变量_13赋值为13,此时屏显:15 14 13
再跳转到 :begin
第五次循环,Num的值变成1,for语句就是:for /l %%i in (0 1 1) do ...
假设此时a值为12,因为变量_12未定义,第7行if条件不成立,if后面的语句不会执行;
执行到第8行,将变量_12赋值为12,此时屏显:15 14 13 12
再跳转到 :begin
第六次循环,Num的值变成0,for语句就是:for /l %%i in (0 1 0) do ...
假设a值为10,因为变量_10未定义,第7行if条件不成立,if后面的语句不会执行;
执行到第8行,将变量_10赋值为10,此时屏显:15 14 13 12 10
再跳转到 :begin
第七次循环,Num的值变成-1,for语句就是:for /l %%i in (0 1 -1) do ...
for /l 循环语句终止步比起始步小,不执行do后面的语句
至此循环结束。
假设第三、四、五、六次循环中任何一次循环出现变量_!a!重复定义的情况,就会像第二次循环一样,重新再来,这样总循环次数虽然增加,但屏显总是5个。
作者: BHsolve 时间: 2014-1-1 15:24
回复 8# PowerShell
我想说这段代码我完全没看懂
作者: BHsolve 时间: 2014-1-1 15:24
回复 10# apang
你要是早来该多好啊。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |