Board logo

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

作者: jhf    时间: 2024-8-28 17:10     标题: 求助批处理如何实现人员的随机分组,且不能重复?

例如,班级同学的分组,50人,3人一组,最后剩的一组
作者: 蚯蚓传奇    时间: 2024-8-28 18:22

@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是同学的名字,每个名字一行
作者: jhf    时间: 2024-8-28 19:01

回复 2# 蚯蚓传奇


   大佬啊,你这不是随机。是按顺序排列的啊
作者: newswan    时间: 2024-8-28 19:24

本帖最后由 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. }
复制代码

作者: 77七    时间: 2024-8-28 19:27

  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. )
复制代码

作者: aloha20200628    时间: 2024-8-28 20:30

本帖最后由 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
复制代码

作者: jhf    时间: 2024-8-28 20:48

回复 5# 77七


    厉害啊佬,能补充一下if的注释吗,刚来是学有点懵
作者: 77七    时间: 2024-8-28 21:26

回复 7# jhf


   双击批处理文件执行,此时 %~1为空值 执行的是 else 前的部分,执行到第4行,"%~f0" # |sort 将调用自身,此时%~1 为 # 执行 else 后部分,对文本行加入随机数,然后将其结果 通过管道 然后排序,从而达到随机排序效果,再通过 set /a 及set /p 将3行并为一行。
作者: Five66    时间: 2024-8-28 23: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'
复制代码

作者: aloha20200628    时间: 2024-8-29 10:24

本帖最后由 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
复制代码

作者: ppll2030    时间: 2024-8-29 15:29

本帖最后由 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
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2