『第
3 楼』:
我用两句话,嘿嘿!好久没露出奸笑了...(八神暴走 哦-哈-哈-哈-哈! 最近返老还童玩kof)
::原理,把有序的数字%%a赋值给 _%随机数%_%%a ,这样当set _ 将变量名排序并列出时,反倒使他们的值1-100的数字变成了随机的。
::而_%随机数%_%%a 中,后面的_%%a是为了避免 随机数相同 时 把上次赋的值给覆盖了.
::为了进一步避免所以用 “_” 将随机数和有序数隔开,而%%a是1-100不重复,这样就绝对不会出现替代现象啦。
@echo off
for /l %%a in (1,1,100) do (call set _%%random%%_%%a=%%a)
for /f "delims== tokens=2" %%a in ('set _') do (echo %%a)
pause ---------------------------------------------------------
实不相瞒,花了好长一段时间理解2楼的代码.
分析下,大家看对不对.
整个思路就是通过对num1-num100原来的值1-100进行随机的互相对换,对换后"面目全非".
首先,代码对1-100这些数进行编号,num1=1,num2=2...num100=100
第二个for
I = 1 to 100
获取[1-100]内随机数R
将编号R的值 与 编号I的值对调
next
第三个for
I = 1 to 100
列出编号I对应的值
over
----------------------------------------------------------
关于第二个for
由于对编号1-100都进行替换操作,替换是与随机编号R之间的,所以每个编号的值!一般!会被换两次.
我觉得这点很good! 举个例子吧:
这里设第一个随机数=39 (若=1则另当别论)
第一次是 NUM(39) 与 NUM(1) 调换值
第二次是 因为for I = 1 to 100, I 始终是要轮到39的,于是NUM(39) 又与 NUM(随机数) 调换值
(当然,假如某次 随机数R 与 I 刚好相等,则相当于没有换.)
随机数R范围 [1-100] ,可能重复,所以可能一个编号的值会被换好几次,且导致其他数也被换,我觉得这点够随机.
另外我认为2楼代码还可以化简一点,容易理解一点:
@echo off
setlocal enabledelayedexpansion
for /l %%I in (1,1,100) do set Num%%I=%%I
for /l %%I in (1,1,100) do (
set /a R=!random! %% 100 + 1
call set /a Num%%I=%%Num!R!%%,Num!R!=!Num%%I!
rem,理解式 NumI = %NumR% ,NumR = %NumI%
rem,注意:由于环境变量表示的性质,这里 %NumI% 只表示上一步时的值,不受同句子中NumI赋值的影响.
)
for /l %%I in (1,1,100) do echo,!Num%%I!
pause
|