@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 编辑 ]
作者: 523066680 时间: 2009-3-16 12:09
我自己顶~
真是的~ 难怪我喜欢写特效,写特效有人加分,写别的东西这么快就沉了
大伙多少说说对这个帖子的观点嘛
作者: wxcute 时间: 2009-3-16 13:27
精彩思路点评:利用随机数作为变量名,再用 SET 显示变量来打乱原有顺序。
当然不是直接用随机数来作变量名,前面加个符号防止不必要的麻烦。
作者: PakTC 时间: 2009-8-9 19:59
这算是利用了批处理的优点吧~
如果用别的语言的话,没这么好利用哟~
我亦有个思路,代码就没那么短了。- @echo off &title Made by PakTC
- setlocal enabledelayedexpansion
- for /l %%a in (1,1,100) do (set number%%a=%%a)
- for /l %%a in (100,-1,1) do (
- set /a rand=!random! %% %%a + 1
- set /a new%%a=number!rand!,TempNum=number!rand!
- set /a number!rand!=number%%a,number%%a=TempNum
- )
- for /l %%a in (1,1,100) do echo,!new%%a!
- pause
复制代码
作者: PakTC 时间: 2009-8-10 09:55
这不是通过100次随机互换
是主次地缩小范围
第一次获取1~100 随机数
然后 获取的那个数与100调换
第二次 就获取1~99内随机数
=======================
获取并缩小范围,把拿过的数扔出范围。
这样就避免了重复,也保证了随机性
作者: batman 时间: 2009-8-10 10:53
_%random%_%%a,此为一大提升,很好,很强大!
作者: terse 时间: 2009-8-10 14:44
如果数字大的话 是否可考虑这样- @echo off&setlocal enabledelayedexpansion
- if "%1" equ "" (
- for /f "tokens=2 delims==" %%i in ('"%~s0 b|sort"') do echo %%i
- pause&exit
- ) else for /l %%i in (1 1 100000) do echo !random!!random!!random!_%%i=%%i
复制代码
作者: applba 时间: 2011-4-26 04:46
本帖最后由 applba 于 2011-4-26 04:54 编辑
问题是:
1.你为了获得一个100以内的数,就需要random100次!
如果是值域是1-1000000以内的呢?你是不是要random 100万次吗!
所有说这种方式只适合值域很小的时候……
作者: hanyeguxing 时间: 2011-4-26 06:26
8# applba
什么时候 1~100 等于1 了?
作者: applba 时间: 2011-4-26 07:38
9# hanyeguxing
假如我只需要一个呢
作者: hanyeguxing 时间: 2011-4-26 08:05
1个数字哪来的重复与不重复?
作者: 523066680 时间: 2011-4-26 09:12
本帖最后由 523066680 于 2011-4-26 09:15 编辑
"问题是:
1.你为了获得一个100以内的数,就需要random100次!
如果是值域是1-1000000以内的呢?你是不是要random 100万次吗!"
"这个问题就是在描述事实,但是没有指出问题哇。"
啊喏,random100万次不是主要问题吧? 你要说的应该是储存100万个变量这个事情。
这个时候 随机数只有 五位数,随机性质方面可能有影响,但是可以通过组合随机数达到X位数。
不管怎么想,我觉得为了获得随机数不重复,"random XX次" 始终还是要滴。
我的马甲在4楼写了一个用随机抽取N次的,效率上会差点吧。
如果有一张大尺寸图片要随机渐显,俺也会采用分块的方式渐显,而不是逐像素地显示,
那样太耗时间了
作者: applba 时间: 2011-4-26 09:28
11# hanyeguxing
汗,一个也可以是两个,三个……
作者: applba 时间: 2011-4-26 09:29
12# 523066680
明白了,是我想多了
作者: CrLf 时间: 2011-4-26 12:45
如果对不定死范围,可以这样:- @echo off&setlocal enabledelayedexpansion&echo %time%
- set n=1000
- (for /l %%a in (1 1 !n!) do (
- set /a ra+=!random!/n
- set os=!ra! !os! !ra!
- )
- for %%a in ("!os: %os% =","!") do echo %%~a)
- echo %time%&pause
复制代码
几乎不定义临时变量,应该是最快的办法了
作者: Hello123World 时间: 2011-4-26 13:46
标记- @echo off
- :hello
- set /a a=%random%%%101
- echo %a%
- pause
- goto hello
复制代码
作者: 523066680 时间: 2013-8-2 10:10
在一两百个数的情况下,用逐个提取的方法要快得多。
数量大的时候当然是set 变量特征 要快一些了,毕竟是内部处理的。- @echo off
- set t=%time%
- setlocal enabledelayedexpansion
- rem 从数组中随机提取元素,装载到SRand
- rem 根据提取的个数,逐步缩小提取范围
- for /l %%a in (1,1,100) do (set Code[%%a]=%%a)
- set "SRand="
- for /l %%a in (100,-1,1) do (
- set /a R=!random! %% %%a + 1
- for %%b in (!R!) do echo !Code[%%b]!
- set Code[!R!]=!Code[%%a]!
- )
-
- echo %t% %time%
- pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |