使用批量重新排列数字

时间:2013-10-19 19:55:01

标签: windows batch-file random

在Windows命令行中,是否可以随机重新排列数字?

例如,我在批处理文件中有以下逻辑,它从s中随机选择数字。这允许重复项目。我希望这些项目不会重复。

@echo off

set i=
set s=12345678
set m=0
:loop
set /a n=%random% %% 8
call set i=%i%%%s:~%n%,1%%
set /a m=m+1
if not %m%==8 goto loop:
echo %i%

pause

实际输出:83254646

所需的输出类似于:83254176

谢谢, 乔尔

3 个答案:

答案 0 :(得分:4)

这是非常快(使用delayed expansion更好,我知道但不喜欢这里):

@ECHO OFF &SETLOCAL
for /l %%a in (1 1 8) do call set "$%%random%%%%a=%%a"
for /f "tokens=2delims==" %%a in ('set "$"') do <nul set/p"=%%a"
echo(

@ECHO OFF &SETLOCAL
for /l %%a in (1 1 8) do call set "$%%random%%%%a=%%a"
for /f "tokens=2delims==" %%a in ('set "$"') do call set "line=%%line%%%%a"
echo(%line%

答案 1 :(得分:3)

以下从源字符串中随机选择一个数字,然后从源中删除该数字。它避免了相对较慢的GOTO,并执行最少的迭代次数。

@echo off
setlocal enableDelayedExpansion
set "s=12345678"
set "i="
for /l %%N in (8 -1 1) do (
  set /a "n1=!random! %% %%N, n2=n1+1"
  for /f "tokens=1,2" %%A in ("!n1! !n2!") do (
    set "i=!i!!s:~%%A,1!"
    set "s=!s:~0,%%A!!s:~%%B!"
  )
)
echo !i!
pause

答案 2 :(得分:2)

你可以将已经完成的数字放在一个关联数组中:

@ECHO OFF &SETLOCAL
set "i="
set "s=12345678"
:loop
set /a n=%random% %% 8
if not defined $%n% (
    call set "i=%i%%%s:~%n%,1%%"
    set "$%n%=1"
)  else (
    goto:loop
)
set /a m+=1
if not %m%==8 goto:loop
echo %i%