%random%变量不返回随机数

时间:2016-10-27 00:23:05

标签: batch-file random range

我正在使用此代码:

set /a alg=!random!*!activecount!/32768+1

在大多数情况下,它有效。但是,!random!变量不会生成完全随机的数字。相反,它总是以缓慢的速度计数。现在,假设变量!activecount!等于2,它将持续生成1或2,而不会更改,持续很长时间。 为什么随机变量不是随机变量?事后我尝试回复!random!,然后它会生成一个随机数。是什么给了什么?

1 个答案:

答案 0 :(得分:6)

你没有展示足够的代码,但我想我知道你的问题是什么。

您的代码在一个命令会话中的简单循环中正常工作:

@echo off
setlocal enableDelayedExpansion
set "activecount=10"
for /l %%n in (1 1 10) do (
  set /a alg=!random!*activecount/32768+1
  echo !alg!
)

- 输出 -

7
8
6
6
9
4
3
1
8
9

但如果每个都不起作用!随机!是在一个新的cmd.exe会话中。这是因为随机序列是在cmd.exe启动时启动的,种子值是从当前时间派生的,而种子每秒只更改一次。见https://stackoverflow.com/a/19697361/1012053

以下是您在新的cmd.exe会话中执行的代码:

@echo off
setlocal disableDelayedExpansion
set "activecount=10"
for /l %%n in (1 1 10) do (
  cmd /v:on /c "set /a !random!*activecount/32768+1"
  echo(
)

- 输出 -

6
6
6
6
6
6
6
6
6
6

如果我们打印出raw!random,就更容易看到发生了什么!值,如果我们在每个5的簇之间放置1秒的延迟:

@echo off
for /l %%n in (1 1 5) do (
  for /l %%m in (1 1 5) do (
    cmd /v:on /c "set /a !random!"
    echo(
  )
  timeout /t 1 >nul
  echo(
)

- 输出 -

21755
21755
21755
21755
21755

21758
21758
21758
21758
21758

21761
21761
21761
21761
21761

21764
21764
21764
21764
21764

21768
21768
21768
21768
21768

在任何给定的秒内,种子值保持不变,因此第一个随机数是常数。但是在每个新的秒数上,种子值会增加少量。给定用于将“随机”数限制为较小范围的公式,您可以看到结果值需要很长时间才能更改。

请记住,第一个代码表明伪随机数在同一个会话中起作用。但是,在同一秒内启动的每个cmd.exe会话都会获得相同的种子值,因此每个会话都会获得完全相同的伪随机序列。