%random%变量不返回随机数

-1 random batch-file range

我正在使用此代码:

set /a alg=!random!*!activecount!/32768+1
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,它的工作原理.但是,!random!变量不会生成完全随机的数字.相反,它总是以缓慢的速度计数.现在,假设变量!activecount!等于2,它将不断地生成1或2,而不会改变很长时间.为什么随机变量不是随机变量?!random!事后我试着回声,然后产生一个随机数.是什么赋予了?

dbe*_*ham 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!
)
Run Code Online (Sandbox Code Playgroud)

--OUTPUT--

7
8
6
6
9
4
3
1
8
9
Run Code Online (Sandbox Code Playgroud)

但如果每个都不起作用!随机!是在一个新的cmd.exe会话中.这是因为随机序列是在cmd.exe启动时启动的,种子值是从当前时间派生的,而种子每秒只更改一次.请参阅/sf/answers/1378815301/

以下是您在新的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(
)
Run Code Online (Sandbox Code Playgroud)

- 输出 -

6
6
6
6
6
6
6
6
6
6
Run Code Online (Sandbox Code Playgroud)

如果我们打印出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(
)
Run Code Online (Sandbox Code Playgroud)

- 输出 -

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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我建议在每个cmd.exe会话开始时使用这个"随机化"代码:`for/L %% i in(0,1,!time:〜-1!)do set/A!random! (2认同)