Board logo

标题: [数值计算] [分享]测试了一下批处理中Random取值区间 [打印本页]

作者: techon    时间: 2011-5-9 00:52     标题: [分享]测试了一下批处理中Random取值区间

  1. @echo off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. for /l %%c in (0,0,1) do (
  4.   if !random! equ 0 (
  5.     echo ^^!RANDOM^^!==0
  6.     if !max! equ 1 pause&exit
  7.     set min=1
  8.   )
  9.   if !random! equ 32767 (
  10.     echo ^^!RANDOM^^!==32767
  11.     if !min! equ 1 pause&exit
  12.     set max=1
  13.   )
  14. )
复制代码
结果验证了cmd内置环境变量%RANDOM%可取最小值为0,可取最大值为32767
由此可推 环境变量%RANDOM%的取值范是:[0,32767],注意这是闭区间
作者: neorobin    时间: 2011-5-9 01:40

应该说你证明的是 random 的取值集合中存在 0 和 32767 这两个元素.
如果把你代码中的 0 和 32767 换成 [0,32767] 之内的任意别的数字, 例 0->a, 32767->b (假设 a<=b),
那么 random 的取值范围就被证明是 [a,b], 与你的结论就矛盾了.
作者: techon    时间: 2011-5-9 01:48

谢谢提醒 我主要目的是测试这个区间是开还是闭
作者: hanyeguxing    时间: 2011-5-9 08:51

本帖最后由 hanyeguxing 于 2011-5-9 09:09 编辑

如果验证,可以直接:
  1. @echo off
  2. :a
  3. if %random%==0 set a=1
  4. if %random%==32767 set b=1
  5. if "%a%%b%"=="11" (echo;完成&pause) else goto:a
复制代码
rand()生成 0 ~ RAND_MAX 之间的一个伪随机数,与种子 srand() 、时间 time() 通过线性同余算法获取变量 %random% 的范围为 0 ~ 32767

cmd.exe:
msvcrt.rand, Ord:02EDh
:4AD12E3B FF156412D04A      Call dword ptr [4AD01264]
:4AD12E41 50           push eax
:4AD12E42 E9207AFFFF       jmp 4AD0A867

msvcrt.time, Ord:0317h
:4AD04BEE FF153C12D04A      Call dword ptr [4AD0123C]
:4AD04BF4 50           push eax

msvcrt.srand, Ord:02FBh
:4AD04BF5 FF154012D04A      Call dword ptr [4AD01240]
:4AD04BFB 59           pop ecx
:4AD04BFC 59           pop ecx
:4AD04BFD 5F           pop edi
:4AD04BFE 5E           pop esi
:4AD04BFF 5B           pop ebx
:4AD04C00 C9           leave
:4AD04C01 C20400         ret 0004
:4AD04C04 41           inc ecx
:4AD04C05 007500         add byte ptr [ebp+00], dh
:4AD04C08 7400          je 4AD04C0A
作者: Batcher    时间: 2011-5-9 10:38

微软的文档里面不是明确说的了吗
%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。

作者: 523066680    时间: 2011-5-9 10:48

可取最大值为32767
由此可推 环境变量%RANDOM%的取值范是:[0,32767],

验证方式相当……  不讨论。




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