批随机名称生成器

时间:2017-05-27 02:19:26

标签: batch-file

我有一个包含1000个名字的文本文档,每行一个。我希望能够将变量设置为等于随机选择的其中一个名称。我该怎么做?谢谢。

2 个答案:

答案 0 :(得分:1)

一种可能的方法是计算文本文件的行数,然后动态设置for /F loopskip选项并仅读取一行:

for /F %%C in ('^< ".\textfile.txt" find /C /V ""') do set /A "COUNT=%%C"
if %COUNT% LEQ 0 (set /A "NUMBER=0") else (set /A "NUMBER=%RANDOM%%%%COUNT%")
if %NUMBER% LEQ 0 (set "SKIP=") else (set "SKIP=skip=%NUMBER%")
for /F "usebackq %SKIP% delims=" %%L in (".\textfile.txt") do (
    set "LINE=%%L"
    goto :CONT
)
:CONT
echo(%LINE%

您可以使用input redirection

而不是for /F来阅读该行
for /F %%C in ('^< ".\textfile.txt" find /C /V ""') do set /A "COUNT=%%C"
if %COUNT% LEQ 0 (set /A "NUMBER=0") else (set /A "NUMBER=%RANDOM%%%%COUNT%+1")
< ".\textfile.txt" (
    for /L %%I in (1,1,%NUMBER%) do (
        set "LINE=" & set /P LINE=""
    )
)
echo(%LINE%

答案 1 :(得分:0)

即使这不是严格按照规则进行的,因为您提供的规范没有显示任何解决问题的尝试,

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q44012305.txt"
:: detect number of entries in file
FOR /f %%a IN ('type "%filename1%"^|find /c /v ""') DO SET count=%%a
SET /a maxselect=(32767 / count) * count
:reselect
SET /a selection=%RANDOM%
IF %selection% geq %maxselect% GOTO reselect
SET /a selection=(selection %% count)+1
FOR /f "tokens=1*delims=[]" %%a IN (
 'type "%filename1%"^|find /n /v ""'
 ) DO IF %%a==%selection% SET "selection=%%b"
ECHO %selection%

GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

我使用了一个名为q44012305.txt的文件,其中包含一些虚拟数据供我测试。

首先,使用find计算文件中的行数。

由于随机数发生器的范围是0..32767,所以做一些maxselect的体操(计算是机械地执行,而不是优化),以便建立RNG的最大值。例如,如果文件中有1,000行,则0..32767 mod 1000的范围产生0..767的可能性略大于768..999。通过将范围限制为0..31999,任何特定选择的几率与RNG一样线性。

在1 .. count范围内进行适当选择后,重新读取文件,这次使用find对括号中的每一行进行编号。由于delims是括号,%%a将获取行号和%%b(因为选择了两个令牌,1*以及%%b成功提名的%%a)将被设置为相应行上的名称。当%%aselection匹配时,请将selection设置为名称。

(这只是我在汇编语言中接管的历史 - 重新使用变量,因为它有一个合适的名称)

相关问题