Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 使用批处理重新排列编号_Windows_Batch File_Random - Fatal编程技术网

Windows 使用批处理重新排列编号

Windows 使用批处理重新排列编号,windows,batch-file,random,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 所需的输出类似于:

在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

谢谢,
Joel

您可以将已完成的数字放入关联数组中:

@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%

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

@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
这比imo更快(延迟扩展更好,我知道但不喜欢这里):


不是最佳解决方案,因为迭代次数随机变化。虽然只有8个值可供选择,但随着选择数量的增加,速度可能越来越慢,令人无法接受。但这仍然是一个批处理脚本。批处理脚本的最佳速度并不为人所知。+1-很好的实用和高效的解决方案,尽管我肯定会使用延迟扩展。此处不需要,因为仅限于单个数字,但如果数字扩展到2位或更多位,则需要在随机数和值之间插入非数字字符,如
。否则,可能会由于重复而丢失值。例如,12_1和1_21在没有
的情况下是重复的。这个解决方案非常倾向于先低后高,因为重复的随机数总是先低后高。但从实际的角度来看,这不值得担心。我认为这种逻辑最适合我的项目,因为“s”不仅仅限于数字。它可以包含我设置的任何字符串和/或其他变量。示例:“s=%i1%%i2%%i3%”。谢谢德本汉姆。
@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%