找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 28226|回复: 11

[数值计算] [已解决]求解释批处理 互不相同随机数生成

[复制链接]
发表于 2013-12-30 17:09:13 | 显示全部楼层 |阅读模式
本帖最后由 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
复制代码
代码如上,希望能一步一步讲解。先谢谢了
发表于 2013-12-30 21:31:37 | 显示全部楼层
哪里不懂就直接问吧
 楼主| 发表于 2013-12-31 14:18:38 | 显示全部楼层
回复 2# DAIC


    嗯,好的。
问题:第一次给_!a!赋值后,_!a!有定义了。那不就一直是begin到if间的死循环了?如何实现输出五个不同的随机数的
发表于 2013-12-31 17:24:27 | 显示全部楼层
回复 3# BHsolve


    第六行会生产一个“随机”数字赋值给变量a,所以_!a!也会发生变化,不会造成死循环。
 楼主| 发表于 2013-12-31 21:22:41 | 显示全部楼层
回复 4# DAIC

a变量被赋予新值这没问题,_!a!变量发生改变是 _!a! --> !a! -->!random!%%20  没有错吧
_!a!仍然有定义,但是值被改变了。
没有死循环也就是说,这样说defined这里判断的并不是有没有定义而是变量_!a!二次扩展后值一不一致?defined刷新环境变量,是在判定的变量更新时?
发表于 2014-1-1 11:26:31 | 显示全部楼层
回复 5# BHsolve


    是的,defined也只是一个普通的命令而已,一般都是先进行变量扩展/替换,然后执行命令。
 楼主| 发表于 2014-1-1 12:38:50 | 显示全部楼层
回复 6# DAIC

昨天好像理解的不是很到位
    今天看了""扩起来好像是说不转义 ! %
假设:!a!被赋值为5  _!a!=!a!  其实就是_5=5
下次的循环中如果!a!变为6
变量_5没有变化还是有定义   而_!a!因为变量延迟变成_6自然就没有定义

这样理解才对吧
发表于 2014-1-1 13:05:30 | 显示全部楼层
从1----10000的数字中,随机选取5个不重复的随机数,赋值给变量aaa
powershell代码
  1. $aaa = 1..10000 | Get-Random -Count 5
复制代码
发表于 2014-1-1 13:10:38 | 显示全部楼层
回复 7# BHsolve


    对
发表于 2014-1-1 14:17:32 | 显示全部楼层
楼主还在纠结,偶来码码字,看楼主能否明白:
  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个。
 楼主| 发表于 2014-1-1 15:24:07 | 显示全部楼层
回复 8# PowerShell


    我想说这段代码我完全没看懂
 楼主| 发表于 2014-1-1 15:24:53 | 显示全部楼层
回复 10# apang


    你要是早来该多好啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 00:17 , Processed in 0.020941 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表