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

[其他] [分析代码]批处理随机输出数字1~100不重复

[复制链接]
发表于 2009-3-16 09:15:50 | 显示全部楼层 |阅读模式
我试着分析一次哈~  

@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



原理:     %%a从1~100  把他们赋值给 变量名“_%random% ” 这样,当把名称有序列出时,对应的值就被打乱了
        但是 当出现%random% 两次相同时,就会因变量名相同而把上次的值给替换掉,

              于是,就以_%%random%%_%%a 为名,而%%a是1-100不重复,中间又用 _ 隔开,绝不会出现替代。

后面的一句for就是把变量名有序输出,并显示他们的值。


我只用这个代码做过一个效果:随机打出图像的点,不重复
不知道有没有人能举一个好的应用例子呢,为表感谢分享 我会酌情加分的。

[ 本帖最后由 523066680 于 2009-3-16 09:21 编辑 ]

评分

参与人数 2PB +15 收起 理由
batman + 10 这就是技术革新
Batcher + 5 感谢分享

查看全部评分

 楼主| 发表于 2009-3-16 12:09:42 | 显示全部楼层
我自己顶~
真是的~ 难怪我喜欢写特效,写特效有人加分,写别的东西这么快就沉了

大伙多少说说对这个帖子的观点嘛
发表于 2009-3-16 13:27:52 | 显示全部楼层
精彩思路点评:利用随机数作为变量名,再用 SET 显示变量来打乱原有顺序。

当然不是直接用随机数来作变量名,前面加个符号防止不必要的麻烦。
发表于 2009-8-9 19:59:32 | 显示全部楼层
这算是利用了批处理的优点吧~

如果用别的语言的话,没这么好利用哟~
我亦有个思路,代码就没那么短了。
  1. @echo off &title Made by PakTC
  2. setlocal enabledelayedexpansion
  3. for /l %%a in (1,1,100) do (set number%%a=%%a)
  4. for /l %%a in (100,-1,1) do (
  5.   set /a rand=!random! %% %%a + 1
  6.   set /a new%%a=number!rand!,TempNum=number!rand!
  7.   set /a number!rand!=number%%a,number%%a=TempNum
  8. )
  9. for /l %%a in (1,1,100) do echo,!new%%a!
  10. pause
复制代码
发表于 2009-8-10 09:55:09 | 显示全部楼层
这不是通过100次随机互换

是主次地缩小范围
第一次获取1~100 随机数
然后 获取的那个数与100调换

第二次 就获取1~99内随机数

=======================
获取并缩小范围,把拿过的数扔出范围。


这样就避免了重复,也保证了随机性
发表于 2009-8-10 10:53:18 | 显示全部楼层
_%random%_%%a,此为一大提升,很好,很强大!
发表于 2009-8-10 14:44:20 | 显示全部楼层
如果数字大的话  是否可考虑这样
  1. @echo off&setlocal enabledelayedexpansion
  2. if "%1" equ "" (
  3.         for /f "tokens=2 delims==" %%i in ('"%~s0 b|sort"') do echo %%i
  4. pause&exit
  5. ) else for /l %%i in (1 1 100000) do echo !random!!random!!random!_%%i=%%i
复制代码

评分

参与人数 1PB +8 收起 理由
523066680 + 8 代码有个性。

查看全部评分

发表于 2011-4-26 04:46:29 | 显示全部楼层
本帖最后由 applba 于 2011-4-26 04:54 编辑

问题是:
1.你为了获得一个100以内的数,就需要random100次!
如果是值域是1-1000000以内的呢?你是不是要random 100万次吗!

所有说这种方式只适合值域很小的时候……
发表于 2011-4-26 06:26:28 | 显示全部楼层
8# applba


什么时候 1~100 等于1 了?
发表于 2011-4-26 07:38:42 | 显示全部楼层
9# hanyeguxing


假如我只需要一个呢
发表于 2011-4-26 08:05:49 | 显示全部楼层
1个数字哪来的重复与不重复?
 楼主| 发表于 2011-4-26 09:12:54 | 显示全部楼层
本帖最后由 523066680 于 2011-4-26 09:15 编辑

"问题是:
1.你为了获得一个100以内的数,就需要random100次!
如果是值域是1-1000000以内的呢?你是不是要random 100万次吗!"

"这个问题就是在描述事实,但是没有指出问题哇。"

啊喏,random100万次不是主要问题吧?  你要说的应该是储存100万个变量这个事情。
这个时候 随机数只有 五位数,随机性质方面可能有影响,但是可以通过组合随机数达到X位数。
不管怎么想,我觉得为了获得随机数不重复,"random XX次" 始终还是要滴。
我的马甲在4楼写了一个用随机抽取N次的,效率上会差点吧。

如果有一张大尺寸图片要随机渐显,俺也会采用分块的方式渐显,而不是逐像素地显示,
那样太耗时间了
发表于 2011-4-26 09:28:16 | 显示全部楼层
11# hanyeguxing


汗,一个也可以是两个,三个……
发表于 2011-4-26 09:29:04 | 显示全部楼层
12# 523066680


明白了,是我想多了
发表于 2011-4-26 12:45:06 | 显示全部楼层
如果对不定死范围,可以这样:
  1. @echo off&setlocal enabledelayedexpansion&echo %time%
  2. set n=1000
  3. (for /l %%a in (1 1 !n!) do (
  4.         set /a ra+=!random!/n
  5.         set os=!ra! !os! !ra!
  6. )
  7. for %%a in ("!os: %os% =","!") do echo %%~a)
  8. echo %time%&pause
复制代码
几乎不定义临时变量,应该是最快的办法了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 04:52 , Processed in 0.022590 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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