标题: [文本处理] 求助批处理如何实现人员的随机分组,且不能重复? [打印本页]
作者: 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- @("a","b","c") | Get-Random -Count 3 | ForEach-Object -Begin { $i=0 ; $n=0 } {
- $i++ ;if ( ( $i % 3 ) -eq 1 ) { $n++ }
- [string]$n + ":" + $_
- }
复制代码
作者: 77七 时间: 2024-8-28 19:27
- @echo off
- cd /d "%~dp0"
- if "%~1" equ "" (
- for /f "tokens=1*" %%a in ('"%~f0" # ^| sort') do (
- set /p="%%b "<nul
- set /a "n+=1,1/(n%%3)" 2>nul || echo=
- )
- echo=
- pause
- exit
- ) else (
- for /f "useback delims=" %%a in ("1.txt") do (
- set str=%%a
- setlocal enabledelayedexpansion
- echo !random! !str!
- endlocal
- )
- )
复制代码
作者: aloha20200628 时间: 2024-8-28 20:30
本帖最后由 aloha20200628 于 2024-8-29 10:26 编辑
回复 1# jhf
共50人,每3人1组,共分16组48人,以下代码运行结果列出同行每组人员编号...
- @echo off &setlocal enabledelayedexpansion
- set/a "r=1+!random!%%50" &set "rL=;!r!;" &set "k=1" &(call :xxx)
- for %%n in (!rL!) do (set/p="%%n,"<nul&set/a "n+=1"&if !n! equ 3 echo,&set "n=")
- endlocal&pause&exit/b
- :xxx
- set/a "r=1+!random!%%50"
- for %%v in (!r!) do if "!rL:*;%%v;=!"=="!rL!" (set "rL=!rL!!r!;"&set/a "k+=1")
- 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- $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 子过程)...- @echo off &setlocal enabledelayedexpansion
- set/a "r=1+!random!%%50" &set "rL=;!r!;" &set "k=1"
- :yyy
- set/a "r=1+!random!%%50"
- for %%v in (!r!) do if "!rL:*;%%v;=!"=="!rL!" (set "rL=!rL!!r!;"&set/a "k+=1")
- if !k! lss 48 goto :yyy
- for %%n in (!rL!) do (echo,%%n&set/a "n+=1"&if !n! equ 3 echo,&set "n=")
- endlocal&pause&exit/b
复制代码
作者: ppll2030 时间: 2024-8-29 15:29
本帖最后由 ppll2030 于 2024-8-29 15:31 编辑
- @echo off &setlocal enabledelayedexpansion
- (for /f "delims=" %%a in (1.txt) do (
- set str=%%a
- echo !random! !str!
- ))>$
- for /f "tokens=1* delims= " %%b in ('type $ ^| sort') do (
- set /a n+=1 &set c=%%c !c!
- set /a m=n%%3
- if !m! == 0 echo, !c!&set c=
- if !n! == 50 echo, !c!
- )
- del /q $&pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |