找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 17260|回复: 10

[文本处理] 求助批处理如何实现人员的随机分组,且不能重复?

[复制链接]
发表于 2024-8-28 17:10:03 | 显示全部楼层 |阅读模式
例如,班级同学的分组,50人,3人一组,最后剩的一组
发表于 2024-8-28 18:22:04 | 显示全部楼层
@echo off  
setlocal enabledelayedexpansion
set /a group=3
set count=0
for /f "delims=" %%a in (名单.txt) do (
    set /a count+=1
    set "person!count!=%%a"
)
for /l %%i in (1,1,%count%) do (
    set /a a=%%i %% group + 1
    echo !person%%i!: !a!  组
)
endlocal
pause

其中%group%是要分几组
名单.txt是同学的名字,每个名字一行
 楼主| 发表于 2024-8-28 19:01:18 | 显示全部楼层
回复 2# 蚯蚓传奇


   大佬啊,你这不是随机。是按顺序排列的啊
发表于 2024-8-28 19:24:02 | 显示全部楼层
本帖最后由 newswan 于 2024-8-28 19:39 编辑

powershell

  1. @("a","b","c") | Get-Random -Count 3 | ForEach-Object -Begin { $i=0 ; $n=0 }  {
  2.     $i++ ;if ( ( $i % 3 ) -eq 1  ) { $n++ }
  3.     [string]$n + ":" + $_
  4. }
复制代码
发表于 2024-8-28 19:27:22 | 显示全部楼层
  1. @echo off
  2. cd /d "%~dp0"
  3. if "%~1" equ "" (
  4.         for /f "tokens=1*" %%a in ('"%~f0" # ^| sort') do (
  5.                 set /p="%%b "<nul
  6.                 set /a "n+=1,1/(n%%3)" 2>nul || echo=
  7.         )
  8.         echo=
  9.         pause
  10.         exit
  11. ) else (
  12.         for /f "useback delims=" %%a in ("1.txt") do (
  13.                 set str=%%a
  14.                 setlocal enabledelayedexpansion
  15.                 echo !random! !str!
  16.                 endlocal
  17.         )
  18. )
复制代码
发表于 2024-8-28 20:30:53 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-8-29 10:26 编辑

回复 1# jhf

共50人,每3人1组,共分16组48人,以下代码运行结果列出同行每组人员编号...

  1. @echo off &setlocal enabledelayedexpansion
  2. set/a "r=1+!random!%%50" &set "rL=;!r!;" &set "k=1" &(call :xxx)
  3. for %%n in (!rL!) do (set/p="%%n,"<nul&set/a "n+=1"&if !n! equ 3 echo,&set "n=")
  4. endlocal&pause&exit/b
  5. :xxx
  6.         set/a "r=1+!random!%%50"
  7.         for %%v in (!r!) do if "!rL:*;%%v;=!"=="!rL!" (set "rL=!rL!!r!;"&set/a "k+=1")
  8.         if !k! equ 48 (exit/b) else goto :xxx
复制代码
 楼主| 发表于 2024-8-28 20:48:00 | 显示全部楼层
回复 5# 77七


    厉害啊佬,能补充一下if的注释吗,刚来是学有点懵
发表于 2024-8-28 21:26:02 | 显示全部楼层
回复 7# jhf


   双击批处理文件执行,此时 %~1为空值 执行的是 else 前的部分,执行到第4行,"%~f0" # |sort 将调用自身,此时%~1 为 # 执行 else 后部分,对文本行加入随机数,然后将其结果 通过管道 然后排序,从而达到随机排序效果,再通过 set /a 及set /p 将3行并为一行。
发表于 2024-8-28 23:12:12 | 显示全部楼层
powershell
全部编码ansi/gbk

  1. $a=1;$b=1;gc '名单.txt' |where {$_} |sort {get-random} |foreach {if($a -gt 3){$a=1;$b+=1};$a+=1;,($b,$_)} |group {$_[0]} |foreach {"";$_.group|foreach{$_[1]}} |set-content '随机分组名单.txt'
复制代码
发表于 2024-8-29 10:24:07 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-8-29 10:42 编辑

回复 1# jhf

6楼代码已被订正,精简了多余的循环和分隔符处理等操作步骤
其输出格式为》每行3人一组的人员编号,如下:
9,14,6,
38,28,1,
19,11,39,
15,17,35,
...

若输出格式变为》每行均是人员编号,其组别用空行分割,如下:
30
43
50

8
42
10
...
则可用以下代码(不用 call 子过程)...

  1. @echo off &setlocal enabledelayedexpansion
  2. set/a "r=1+!random!%%50" &set "rL=;!r!;" &set "k=1"
  3. :yyy
  4.    set/a "r=1+!random!%%50"
  5.    for %%v in (!r!) do if "!rL:*;%%v;=!"=="!rL!" (set "rL=!rL!!r!;"&set/a "k+=1")
  6.    if !k! lss 48 goto :yyy
  7. for %%n in (!rL!) do (echo,%%n&set/a "n+=1"&if !n! equ 3 echo,&set "n=")
  8. endlocal&pause&exit/b
复制代码
发表于 2024-8-29 15:29:49 | 显示全部楼层
本帖最后由 ppll2030 于 2024-8-29 15:31 编辑
  1. @echo off &setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in (1.txt) do (
  3.                 set str=%%a
  4.                 echo !random! !str!
  5. ))>$
  6. for /f "tokens=1* delims= " %%b in ('type $ ^| sort') do (
  7.         set /a n+=1 &set c=%%c !c!
  8.         set /a m=n%%3
  9.         if !m! == 0 echo, !c!&set c=
  10.         if !n! == 50 echo, !c!
  11. )
  12. del /q $&pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 20:51 , Processed in 0.016732 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表