Hier mein Vorschlag, der für eine Klassenliste durchaus ausreichen sollte:
@Rem verwendete Variable:
@Rem l := Liste
@Rem m := Maximalanzahl
@Rem n := neue Liste
@Rem r := Zufallszahl
@Rem v := Vergleichsliste
@Rem z := Zähler
@ Echo.
@ SetLocal
Für Fragen bitte einfach melden.
@ Set m=22
@ Rem hiermit wird sichergestellt, dass die alte Liste l nicht leer ist, da es sonst zu Fehler in der Verarbeitung kommt.
@ Set l=-
@ Set z=0
(Doppelpunkt)top
@Rem If %z% neq 0 Pause
@Rem cls
@ Set /a r=%random% %%m%
@Rem Echo r : „%r%“
@Rem Echo m : „%m%“
@Rem Echo z : „%z%“
@Rem Echo l : „%l%“
(Doppelpunkt)test
@ Rem die neue Liste ist die alte Liste und die neue Zufallszahl
@ Set n=%l%%r%-
@ Rem Die Vergleichsliste wird die alte Liste.
@ Rem Falls die neue Zufallszahl in der Vergleichsliste enthalten ist, so wird diese aus der Vergleichsliste entfernt.
@ If %r% == 0 Set v=%l:-0-=-%
@ If %r% == 1 Set v=%l:-1-=-%
@ If %r% == 2 Set v=%l:-2-=-%
@ If %r% == 3 Set v=%l:-3-=-%
@ If %r% == 4 Set v=%l:-4-=-%
@ If %r% == 5 Set v=%l:-5-=-%
@ If %r% == 6 Set v=%l:-6-=-%
@ If %r% == 7 Set v=%l:-7-=-%
@ If %r% == 8 Set v=%l:-8-=-%
@ If %r% == 9 Set v=%l:-9-=-%
@ If %r% == 10 Set v=%l:-10-=-%
@ If %r% == 11 Set v=%l:-11-=-%
@ If %r% == 12 Set v=%l:-12-=-%
@ If %r% == 13 Set v=%l:-13-=-%
@ If %r% == 14 Set v=%l:-14-=-%
@ If %r% == 15 Set v=%l:-15-=-%
@ If %r% == 16 Set v=%l:-16-=-%
@ If %r% == 17 Set v=%l:-17-=-%
@ If %r% == 18 Set v=%l:-18-=-%
@ If %r% == 19 Set v=%l:-19-=-%
@ If %r% == 20 Set v=%l:-20-=-%
@ If %r% == 21 Set v=%l:-21-=-%
@Rem Echo n : „%n%“
@Rem Echo v : „%v%“
@ Rem falls die alte Liste mit der Vergleichsliste identisch ist, so befindet sich die neue Zufallszahl nicht in der alten Liste. In diesem Fall kann die neue Zufallszahl der alten Liste hinzugefügt werden.
@ If „%l%“ == „%v%“ Goto name
@ Rem Die neue Zufallszahl ist bereits in der alten Liste enthalten und wird deshalb um 1 erhöht, wenn Sie unterhalb des größten Wertes liegt.
@ If %r% lss %m% Set /a r=%r%+1
@ Rem ansonsten wird die Zahl auf 0 gesetzt
@ If %r% == %m% Set r=0
@ Goto Test
(Doppelpunkt)name
@ Rem die neue Zufallszahl der alten Liste hinzugefügt.
@ Set l=%l%%r%-
@ Rem Der Name wird ausgegeben und
@ If %r% == 0 echo Max Mustermann
@ If %r% == 1 echo Marianne Musterfrau
@ If %r% == 2 echo Manfred Musterkind
@ If %r% == 3 echo name3
@ If %r% == 4 echo name4
@ If %r% == 5 echo name5
@ If %r% == 6 echo name6
@ If %r% == 7 echo name7
@ If %r% == 8 echo name8
@ If %r% == 9 echo name9
@ If %r% == 10 echo name10
@ If %r% == 11 echo name11
@ If %r% == 12 echo name12
@ If %r% == 13 echo name13
@ If %r% == 14 echo name14
@ If %r% == 15 echo name15
@ If %r% == 16 echo name16
@ If %r% == 17 echo name17
@ If %r% == 18 echo name18
@ If %r% == 19 echo name19
@ If %r% == 20 echo name20
@ If %r% == 21 echo name21
@ Rem Der Zähler über die ausgegebenen Namen wird um 1 erhöht.
@ Set /a z=z+1
@ Rem falls noch nicht alle Namen ausgegeben worden sind, wird der nächste Name ermittelt
@ If %z% lss %m% Goto top
@ EndLocal