Eu tenho uma lista de 15 nomes e quero executar um script que irá produzir esses nomes em um arquivo txt em ordem aleatória. Isso é muito difícil, ou até mesmo possível? Qualquer ajuda é apreciada.
Por favor, dê mais detalhes; como estão entrando na lista de nomes?
wonea
... e qual sistema operacional?
Arjan
Respostas:
2
O arquivo de lote a seguir reorganiza e imprime aleatoriamente seus parâmetros com uma distribuição de probabilidade quase uniforme.
@echo off
setlocal enabledelayedexpansion
set i=0
for %%j in (%*) do (
set /A i=i+1
set name[!i!]=%%j
set roll[!i!]=!random!
)
set length=%i%
for /L %%i in (0,1,32767) do (
for /L %%j in (1,1,%length%) do (
if %%i EQU !roll[%%j]! echo !name[%%j]!
)
)
No primeiro loop, ele atribui um número aleatório a todos os parâmetros entre zero e 32767 usando a variável interna% random%. Em seguida, ele percorre todos os 'rolos' possíveis e imprime os parâmetros com números atribuídos correspondentes. Se vários parâmetros rolarem o mesmo número, eles serão ecoados na ordem em que apareceram como parâmetros.
O código é muito ineficiente, mas compacto e simples. Ao reduzir o alcance efetivo da variável aleatória, o algoritmo pode receber um aumento significativo de velocidade com o custo de aumentar a tendência para os primeiros parâmetros especificados. Ou você pode usar uma rotina de classificação adequada, como a especificada Aqui .
Se você quiser que o arquivo em lote opere em um arquivo de texto em vez de em uma lista de parâmetros, poderá percorrer a entrada com um comando for, adicionando correspondências a uma lista de cadeias de caracteres separadas, por exemplo: for /F "tokens=1 delims= " %%i in ("input.txt") do (set list=!list! %%i), em seguida, chamando o algoritmo com essa lista, por exemplo: call :randomsort %list%.
A gravação em um arquivo de saída em vez do console pode ser feita executando o programa em lote como está, redirecionando sua saída com randomsort.bat > output.txtou anexando >> output.txt para o comando echo.
Respostas:
O arquivo de lote a seguir reorganiza e imprime aleatoriamente seus parâmetros com uma distribuição de probabilidade quase uniforme.
No primeiro loop, ele atribui um número aleatório a todos os parâmetros entre zero e 32767 usando a variável interna% random%. Em seguida, ele percorre todos os 'rolos' possíveis e imprime os parâmetros com números atribuídos correspondentes. Se vários parâmetros rolarem o mesmo número, eles serão ecoados na ordem em que apareceram como parâmetros.
O código é muito ineficiente, mas compacto e simples. Ao reduzir o alcance efetivo da variável aleatória, o algoritmo pode receber um aumento significativo de velocidade com o custo de aumentar a tendência para os primeiros parâmetros especificados. Ou você pode usar uma rotina de classificação adequada, como a especificada Aqui .
Se você quiser que o arquivo em lote opere em um arquivo de texto em vez de em uma lista de parâmetros, poderá percorrer a entrada com um comando for, adicionando correspondências a uma lista de cadeias de caracteres separadas, por exemplo:
for /F "tokens=1 delims= " %%i in ("input.txt") do (set list=!list! %%i)
, em seguida, chamando o algoritmo com essa lista, por exemplo:call :randomsort %list%
.A gravação em um arquivo de saída em vez do console pode ser feita executando o programa em lote como está, redirecionando sua saída com
randomsort.bat > output.txt
ou anexando>> output.txt
para o comando echo.fonte