Board logo

标题: [数值计算] random命令在cmd窗口和批处理中变化不同 [打印本页]

作者: tireless    时间: 2009-2-15 18:42     标题: 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:\>


为什么会这样?
作者: wxcute    时间: 2009-2-15 18:56     标题: 这样就好些了

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

作者: tireless    时间: 2009-2-15 19:05     标题: 回复 2楼 的帖子

不用 setlocal 和 endlocal 也可。
但是多次运行就会很连续。
作者: BBCC    时间: 2009-2-15 19:42

好像看过有人加一个%random%做label,可以减少一点连续性.
作者: lhjoanna    时间: 2009-2-15 19:54

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

我曾经也试过...
作者: johnson3333    时间: 2009-6-28 01:11

  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 编辑 ]
作者: zqz0012005    时间: 2009-6-28 01:24

原帖由 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是如何实现的我不知道,如果你感兴趣可以深入研究。以上拙见仅供参考……

作者: Batcher    时间: 2009-6-28 12:00

有条件玩玩Linux下的C编程的朋友,可以到头文件里面看看随即函数的种子是从哪里来的,呵呵。
虽然Windows源码咱们看不到,但原理应该类似。
作者: slore    时间: 2009-6-28 12:23

第一次random的种子是时间

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

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

多次运行,只有1是连续的。
因为执行过%random%一遍后,种子就变了。
作者: slore    时间: 2009-6-28 12:26

所以要用的话,可以把1F的测试代码改成这样:
echo %random% 1>nul
>>1.txt echo %random%
作者: jackerloo2009    时间: 2009-7-2 08:37

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




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2