[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] [分析代码]批处理随机输出数字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



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

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

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


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

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

评分人数

在一两百个数的情况下,用逐个提取的方法要快得多。
数量大的时候当然是set 变量特征 要快一些了,毕竟是内部处理的。
  1. @echo off
  2. set t=%time%
  3. setlocal enabledelayedexpansion
  4.     rem 从数组中随机提取元素,装载到SRand
  5.     rem 根据提取的个数,逐步缩小提取范围
  6.     for /l %%a in (1,1,100) do (set Code[%%a]=%%a)
  7.     set "SRand="
  8.     for /l %%a in (100,-1,1) do (
  9.         set /a R=!random! %% %%a + 1
  10.         for %%b in (!R!) do echo !Code[%%b]!
  11.         set Code[!R!]=!Code[%%a]!
  12.     )
  13. echo %t% %time%
  14. pause
复制代码

TOP

标记
  1. @echo off
  2. :hello
  3. set /a a=%random%%%101
  4. echo %a%
  5. pause
  6. goto hello
复制代码

TOP

如果对不定死范围,可以这样:
  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
复制代码
几乎不定义临时变量,应该是最快的办法了

TOP

12# 523066680


明白了,是我想多了

TOP

11# hanyeguxing


汗,一个也可以是两个,三个……

TOP

本帖最后由 523066680 于 2011-4-26 09:15 编辑

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

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

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

如果有一张大尺寸图片要随机渐显,俺也会采用分块的方式渐显,而不是逐像素地显示,
那样太耗时间了

TOP

1个数字哪来的重复与不重复?
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

9# hanyeguxing


假如我只需要一个呢

TOP

8# applba


什么时候 1~100 等于1 了?
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

本帖最后由 applba 于 2011-4-26 04:54 编辑

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

所有说这种方式只适合值域很小的时候……

TOP

如果数字大的话  是否可考虑这样
  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
复制代码
1

评分人数

TOP

_%random%_%%a,此为一大提升,很好,很强大!
***共同提高***

TOP

这不是通过100次随机互换

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

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

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


这样就避免了重复,也保证了随机性
Press Any Key To Continue...

TOP

这算是利用了批处理的优点吧~

如果用别的语言的话,没这么好利用哟~
我亦有个思路,代码就没那么短了。
  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
复制代码
Press Any Key To Continue...

TOP

返回列表