这种方法确保不发生碰撞,也就是生成的随机数是唯一的:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "ARG=%~1"
set /A ARG+=0
if %ARG% LSS 1472 (goto :FEW) else (goto :MANY)
:MANY
for /L %%I in (0,1,32767) do (
set "RND_!RANDOM!=%%I"
)
set /A COUNT=0
for /F "tokens=2 delims==" %%J in ('set RND_') do (
set /A COUNT+=1
if !COUNT! GTR %ARG% goto :SKIP
ECHO copy /B nul "file%%J.txt"
)
:SKIP
goto :END
:FEW
set /A COUNT=0
:LOOP
if %COUNT% GEQ %ARG% goto :CONT
set /A COUNT+=1
set "RND_%COUNT%=%RANDOM%"
set /A TEST=COUNT-1
for /L %%I in (1,1,%TEST%) do (
if !RND_%%I! EQU !RND_%COUNT%! (
set /A COUNT-=1
)
)
goto :LOOP
:CONT
for /L %%J in (1,1,%COUNT%) do (
ECHO copy /B nul "FILE!RND_%%J!.txt"
)
goto :END
:END
endlocal
exit /B
调用上面的脚本将随机文件的数量作为命令行参数。
脚本中包含两个例程,用于产生随机数:
根据随机文件的数量要创建,适当的程序选择。例程:FEW
只适用于少数随机数字;只要总数目增加,接收重复,因此该随机数生成的所述重复的可能性使得它相当低效的。
例行:MANY
是几个随机数缓慢,因为总有产生32768
项随机序列;一旦总量增加,这种方法是整体性能更好的选择。
所使用的限制次数1472
低于该:FEW
例程选择仅仅是一个任意值在这里。
有大写在用于测试的copy
命令前缀ECHO
命令。无论何时您想要实际创建任何文件,只需将其删除即可。
谢谢,它帮助:) – Katie
虽然这种方法将是在许多情况下足够,要知道''RANDOM在'FOR/L'循环可能会返回重复号码;!您可能会感兴趣的[此帖](http://stackoverflow.com/q/34406594)涉及的生成随机数的无重复... – aschipfl
@aschipfl:谢谢你的笔记 –