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

[数值计算] random命令在cmd窗口和批处理中变化不同

运行以下批处理多次:
  1. >>1.txt echo %random%
复制代码
得到的 1.txt:
20685
20692
20695
20702
20705
20708

%random% 值变化得好连续。。

在命令提示符窗口中,%random% 值会很随机:
C:\>echo %random%
19114

C:\>echo %random%
26744

C:\>echo %random%
15506

C:\>echo %random%
8354

C:\>


为什么会这样?

我曾写测试ping的-n %time1%和-w %time1%参数的延时时间问题时也出现了这种情况
set /p time1=input:
这样每次手动输入同一时间10次时,每次测试ping得到的时间是不同的
但是如果 set time1=100
这样直接指定让代码自动运行10次,只有头一次的结果是不一样的,后面9次测出来的时间都是相同的
学海无涯

TOP

所以要用的话,可以把1F的测试代码改成这样:
echo %random% 1>nul
>>1.txt echo %random%
1

评分人数

TOP

第一次random的种子是时间

cmd下面输入echo %random%
种子就变了。

你在批处理下面写:
@echo off
echo %random%>>1.txt
echo %random%>>2.txt
echo %random%>>3.txt
echo %random%>>4.txt

多次运行,只有1是连续的。
因为执行过%random%一遍后,种子就变了。

TOP

有条件玩玩Linux下的C编程的朋友,可以到头文件里面看看随即函数的种子是从哪里来的,呵呵。
虽然Windows源码咱们看不到,但原理应该类似。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

原帖由 xzyx 于 2009-2-10 13:05 发表 http://bbs.verybat.org/viewthread.php?tid=15859&page=1&fromuid=37#pid167717


一、这里的随机数是依照“种子”并根据一定算法计算出来的。
二、系统默认的“种子”是时间。
三、计算随机数的算法没有必要深究(不同系统算法不尽相同)。
四、你举的例子没有可比较性。你在一楼说运行了5回,即等于打开了5个新的“批处理环境”,而5楼的随机数是在同一个“批处理环境”中产生的,6楼也如此。我们可以猜想——每一个“批处理环境”的第一个随机数由算法A根据“种子”(时间)产生,第二个随机数由算法A根据“种子”以及第一个随机数产生,以此类推……但究竟算法A是如何实现的我不知道,如果你感兴趣可以深入研究。以上拙见仅供参考……
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

  1. @echo off
  2. set /a var1=%random%
  3. echo %var1%>>a.txt
  4. pause
复制代码
结果:
  1. 9779
  2. 9782
  3. 9782
  4. 9785
  5. 9785
  6. 9789
复制代码
为什么得到的是一个逐渐变大的数而不是随机出现的数呢?


tireless兄,我今天也是因为这个问题发问了





[ 本帖最后由 johnson3333 于 2009-6-28 01:13 编辑 ]

TOP

我曾经也试过...
for /f "delims=" %%a in ('%0') do (echo %%a)

TOP

我想这得从random机制想吧,一般来说都是一个函数用来生成随机数种子,然后另一个函数根据种子来产生随机数,安全的随机数产生机制,出现连续性的情况很小。tireless是怎么出现那么连续的随机数呢,我试验怎么没有?

TOP

好像看过有人加一个%random%做label,可以减少一点连续性.
for /f "delims=" %%a in ('%0') do (echo %%a)

TOP

回复 2楼 的帖子

不用 setlocal 和 endlocal 也可。
但是多次运行就会很连续。

TOP

这样就好些了

  1. @echo off
  2. :lp
  3. setlocal
  4. echo %random%
  5. endlocal
  6. pause>nul
  7. goto :lp
复制代码

TOP

返回列表