我正在使用此代码:
set /a alg=!random!*!activecount!/32768+1
在大多数情况下,它有效。但是,!random!
变量不会生成完全随机的数字。相反,它总是以缓慢的速度计数。现在,假设变量!activecount!
等于2,它将持续生成1或2,而不会更改,持续很长时间。
为什么随机变量不是随机变量?事后我尝试回复!random!
,然后它会生成一个随机数。是什么给了什么?
答案 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会话都会获得相同的种子值,因此每个会话都会获得完全相同的伪随机序列。