中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 超级难题 随机输出 不能重复
作者:
标题: 超级难题 随机输出 不能重复 上一主题 | 下一主题
xxx3212
新手上路





积分 7
发帖 3
注册 2007-12-22
状态 离线
『楼 主』:  超级难题 随机输出 不能重复

设置变量 n1 到 n100 每个变量都随机储存一个小于100的数 并且都没重复
主要就要要随机

2008-1-15 18:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xxx3212
新手上路





积分 7
发帖 3
注册 2007-12-22
状态 离线
『第 2 楼』:  

我在批处理之家 http://bbs.bathome.cn 找到了答案
@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 RDOM=!RANDOM! %% 100 + 1
    SET TEMP=!NUM%%I!
    CALL SET NUM%%I=%%NUM!RDOM!%%
    SET NUM!RDOM!=!TEMP!
)
FOR /L %%I IN (1,1,100) DO ECHO !NUM%%I!
PAUSE


2008-1-16 23:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 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




综合型编程论坛

我的作品索引
  
2008-12-13 10:32
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 4 楼』:  

我发现没人鸟我……



综合型编程论坛

我的作品索引
  
2008-12-13 11:29
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 5 楼』:  

来个更简单点的:
@echo off&setlocal enabledelayedexpansion
for /l %%i in (1,1,100) do set "_!random!!random!!random!=%%i"
for /f "tokens=2 delims==" %%i in ('set _') do echo %%i
pause>nul




批处理之家新域名:www.bathome.net
2008-12-13 12:16
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
ZJHJ
高级用户





积分 609
发帖 374
注册 2006-8-2
状态 离线
『第 6 楼』:  

我在网上看到的是先生成顺序数再进行随机交换

2008-12-13 13:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 7 楼』:  

跟我3楼自己做的那个类似啊



综合型编程论坛

我的作品索引
  
2008-12-17 16:58
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: