我有蝙蝠档案
@echo %RANDOM%并使用命令行执行
start randomcheck.bat & start randomcheck.bat打开两个控制台,都包含相同的号码,4645。这不符合随机提供不同的临时文件夹的目的(只有在同时使用它们时,我才需要随机文件夹)。如何在批处理中有正常的随机生成器?
update https://stackoverflow.com/a/19697361/1083704量化了全球种子更新周期。windows shell全局种子每秒钟更新一次。实际上,我必须为安全裕度再增加一秒钟,以防止比赛,并希望这是足够的措施。这真是糟透了。这意味着为我的iCore7启动8个进程需要16秒。我仍然不确定这是否成功,因为没有任何正式规定,尽管最初有8个进程是以相对的时间变化启动的,但可能会发生两个进程同时完成,我必须注意它们不会同时重新启动。这完全是胡说八道,我的问题是,这能在批内治愈,而不诉诸C++或VBScript吗?
发布于 2013-10-31 11:18:36
bash中的$RANDOM没有此缺陷。
@echo win=%RANDOM%
@for /f %%i in ('bash -c "echo $RANDOM"') do @set VAR=%%i
@echo cygwin=%VAR%在运行start randomcheck.bat & start randomcheck.bat时,打印相同的窗口号,但打印不同的窗口号。使用cygwin比为单个命令编写单独的VBScript更好。也许您可以教我如何用windows脚本主机替代bash -c "echo $RANDOM",这将消除安装cygwin的需要。
发布于 2013-10-31 02:22:04
MC ND在他回答的所有问题上都是100%正确的,他的后续评论也是如此.
CMD.EXE的每个实例在启动时使用从当前时间派生的1秒分辨率的种子初始化随机数生成器。在同一秒钟内启动的所有CMD.EXE进程都将得到相同的随机数序列。
另外一个方面--连续秒的初始随机数变化非常缓慢。在我看来,最初的随机数可能实际上是从时间推导出来的种子值,但我不确定。
编辑-我最初是通过实验推断出这一切的。但从那以后我就看到了https://blogs.msdn.microsoft.com/oldnewthing/20100617-00/?p=13673。
下面是一个脚本,演示了CMD.EXE的种子是如何每秒变化一次的,并且种子的变化非常缓慢:
@echo off
setlocal
set "last=%time:~9,1%"
for /l %%N in (1 1 30) do (
call :wait
cmd /c echo %%time%% %%random%% %%random%% %%random%% %%random%% %%random%% %%random%%
)
exit /b
:wait
if %time:~9,1% equ %last% goto :wait
set "last=%time:~9,1%"
exit /b-产出1 --
22:13:26.31 30024 16831 1561 8633 8959 14378
22:13:26.41 30024 16831 1561 8633 8959 14378
22:13:26.51 30024 16831 1561 8633 8959 14378
22:13:26.61 30024 16831 1561 8633 8959 14378
22:13:26.71 30024 16831 1561 8633 8959 14378
22:13:26.81 30024 16831 1561 8633 8959 14378
22:13:26.91 30024 16831 1561 8633 8959 14378
22:13:27.01 30027 27580 19425 32697 19274 18304
22:13:27.11 30027 27580 19425 32697 19274 18304
22:13:27.21 30027 27580 19425 32697 19274 18304
22:13:27.31 30027 27580 19425 32697 19274 18304
22:13:27.41 30027 27580 19425 32697 19274 18304
22:13:27.51 30027 27580 19425 32697 19274 18304
22:13:27.61 30027 27580 19425 32697 19274 18304
22:13:27.71 30027 27580 19425 32697 19274 18304
22:13:27.81 30027 27580 19425 32697 19274 18304
22:13:27.91 30027 27580 19425 32697 19274 18304
22:13:28.01 30030 5560 4521 23992 29588 22231
22:13:28.11 30030 5560 4521 23992 29588 22231
22:13:28.21 30030 5560 4521 23992 29588 22231
22:13:28.31 30030 5560 4521 23992 29588 22231
22:13:28.41 30030 5560 4521 23992 29588 22231
22:13:28.51 30030 5560 4521 23992 29588 22231
22:13:28.61 30030 5560 4521 23992 29588 22231
22:13:28.71 30030 5560 4521 23992 29588 22231
22:13:28.81 30030 5560 4521 23992 29588 22231
22:13:28.91 30030 5560 4521 23992 29588 22231
22:13:29.01 30033 16308 22385 15287 7135 26158
22:13:29.11 30033 16308 22385 15287 7135 26158
22:13:29.21 30033 16308 22385 15287 7135 26158此脚本演示了随机数生成器在单个CMD.EXE进程中“正确地”工作。
@echo off
setlocal enableDelayedExpansion
set "last=%time:~9,1%"
for /l %%N in (1 1 30) do (
call :wait
echo !time! !random! !random! !random! !random! !random! !random!
)
exit /b
:wait
if %time:~9,1% equ %last% goto :wait
set "last=%time:~9,1%"
exit /b-产出2 --
22:16:10.30 24175 26795 4467 2450 12031 9676
22:16:10.40 6873 17221 14201 17898 32541 29918
22:16:10.50 700 21044 25922 8616 24057 7657
22:16:10.60 25370 6519 26054 28443 4865 1931
22:16:10.70 26989 9396 12747 26808 6282 32182
22:16:10.80 22778 11460 11989 26055 10548 1809
22:16:10.90 4668 27372 30965 12923 5941 16533
22:16:11.00 23426 11396 24402 29658 5150 11183
22:16:11.10 1557 13572 18815 21801 4103 23119
22:16:11.20 3459 30126 20484 32750 3360 16811
22:16:11.30 14041 26960 31897 24736 16657 1954
22:16:11.40 5112 18377 30475 18837 12216 10237
22:16:11.50 13136 6241 27074 29398 8996 9738
22:16:11.60 16027 15122 13659 28897 4827 29753
22:16:11.70 27502 8271 11489 21888 16590 7886
22:16:11.80 30405 25582 7288 5432 7310 26557
22:16:11.90 202 11076 23205 20739 28053 12621
22:16:12.00 4234 20370 10355 5974 27590 8732
22:16:12.10 24411 21836 16161 24731 22898 10378
22:16:12.20 23060 17903 10788 19107 29825 15561
22:16:12.30 6772 1371 674 13257 15504 18422
22:16:12.40 1344 31971 23977 8630 10789 15367
22:16:12.50 18945 17823 20691 10497 5958 31613
22:16:12.60 18294 10398 26910 8744 21528 272
22:16:12.70 25603 9991 24084 11667 16977 5843
22:16:12.80 19405 5457 16285 11165 26783 10627
22:16:12.90 20041 31763 26390 11994 19285 12287
22:16:13.00 21342 13853 9336 24080 2555 2067
22:16:13.10 9328 30429 1722 2211 22934 24871
22:16:13.20 8168 21818 19125 11102 449 8813最后,这个脚本演示了给定行中的每个%random%如何扩展到它自己的值,但是在循环迭代之间,行值不会改变,因为循环行只被解析了一次。
@echo off
setlocal
set "last=%time:~9,1%"
for /l %%N in (1 1 30) do (
call :wait
echo %time% %random% %random% %random% %random% %random% %random%
)
exit /b
:wait
if %time:~9,1% equ %last% goto :wait
set "last=%time:~9,1%"
exit /b-产出3 --
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157
22:20:10.98 28188 30311 32299 7392 5874 32157发布于 2013-10-30 21:57:20
cmd中的随机数生成器使用当前时间(第二分辨率)作为种子。因此,从同一秒钟开始的两个进程将产生相同的“随机”数字。
对于不会碰撞的选项,请使用vbscript的随机数生成器(先随机化),或使用guid (可以通过uuidgen或也可以使用vbscript生成)、powershell或.
https://stackoverflow.com/questions/19694021
复制相似问题