Do you know your 'KVZ's?
Python 3, 140 133 124 123 bytes
d=*map(set,'AJK BCDEGPTVZ IY QU SXF MN H L O R W'.split()),
print([d[int(c,16)].pop()for c in'0111141620075581394131a421'])
Try it online!
-1 byte, thanks to Jo King
Python 2, 174 170 158 bytes
from random import*
s=''
for c in'abbbbebHcaaLffObdRebdbWecb':s+=choice(list(set(('AJK BCDEGPTVZ IY QU SXF MN '+c).split()['abcdef'.find(c)])-set(s)))
print s
Try it online!
05AB1E, 28 bytes
A.•¬=©ƶÓÄûkTVã”ØζÞ•Dás#€.rJ‡
Outputs as a single lowercase string.
Try it online or verify \$n\$ random outputs at once.
Explanation:
A # (a) Push the lowercase alphabet
.•¬=©ƶÓÄûkTVã”ØζÞ• # Push compressed string "ajk bcdegptvz iy qu sxf mn"
Dá # (b) Duplicate it, and only keep the letters (removing the spaces)
s# # Swap to get the string again, and split it by spaces
€.r # Shuffle each substring randomly
J # (c) Join it back together to a single string
‡ # Transliterate all characters from (b) to (c) in string (a)
# (and output the result implicitly)
See this 05AB1E tip of mine (section How to compress strings not part of the dictionary?) to understand why .•¬=©ƶÓÄûkTVã”ØζÞ•
is "ajk bcdegptvz iy qu sxf mn"
.
Ruby, 102 bytes
s=[*?A..?Z]*''
%w(AJK BCDEGPTVZ IY QU SXF MN).map{|e|a=e.chars.shuffle;s.gsub!(/[#{e}]/){a.pop}}
$><<s
Try it online!