Board logo

标题: [数值计算] [已解决]求解释批处理 互不相同随机数生成 [打印本页]

作者: BHsolve    时间: 2013-12-30 17:09     标题: [已解决]求解释批处理 互不相同随机数生成

本帖最后由 BHsolve 于 2014-1-1 15:25 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. set "num=5"
  3. :begin
  4. set /a num-=1
  5. for /l %%i in (0,1,%num%) do (
  6. set /a a=!random!%%20
  7. if defined _!a! set /a num+=1&goto begin
  8. set /p=!a! <nul&set "_!a!=!a!"&goto begin
  9. )
  10. 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代码
  1. $aaa = 1..10000 | Get-Random -Count 5
复制代码

作者: DAIC    时间: 2014-1-1 13:10

回复 7# BHsolve


    对
作者: apang    时间: 2014-1-1 14:17

楼主还在纠结,偶来码码字,看楼主能否明白:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "num=5"
  3. :begin
  4. set /a num-=1
  5. for /l %%i in (0,1,%num%) do (
  6.     set /a a=!random!%%20
  7.     if defined _!a! set /a num+=1&goto begin
  8.     set /p=!a! <nul&set "_!a!=!a!"&goto begin
  9. )
  10. 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