标题: [数值计算] [分享]测试了一下批处理中Random取值区间 [打印本页]
作者: techon 时间: 2011-5-9 00:52 标题: [分享]测试了一下批处理中Random取值区间
- @echo off
- SETLOCAL ENABLEDELAYEDEXPANSION
- for /l %%c in (0,0,1) do (
- if !random! equ 0 (
- echo ^^!RANDOM^^!==0
- if !max! equ 1 pause&exit
- set min=1
- )
- if !random! equ 32767 (
- echo ^^!RANDOM^^!==32767
- if !min! equ 1 pause&exit
- set max=1
- )
- )
复制代码
结果验证了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 编辑
如果验证,可以直接:- @echo off
- :a
- if %random%==0 set a=1
- if %random%==32767 set b=1
- 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 |