从字符列表生成所有组合

时间:2019-11-14 07:26:31

标签: perl

我正忙于建立一个用于笔测试器的实验室,以从4个字母的单词创建MD5哈希值。我需要这些单词包含小写和大写字母以及数字和特殊字符的组合,但是我似乎并没有发现如何以所有顺序组合任何给定的字符。所以目前我有这个:

my $str = 'aaaa';
print $str++, $/ while $str le 'dddd';

会这样做:

aaaa
aaab
aaac
aaad
...
...
dddd

但是我无法做到:

Aaaa
AAaa
aAaa
...
dddD

更不用说添加数字和特殊字符了。我真正想做的是使角色根据给定的列表创建单词。因此,如果我觉得我想使用abeDod@#,则应使用这些字符创建所有组合。

编辑以明确说明。

假设我给了字符aBc#,我需要它给它一个计数,使其必须每个单词最多包含4个字母,并包含所有给定字符,例如:

aBc#
Bac#
caB#
#Bca
...

我希望可以澄清这个问题。

1 个答案:

答案 0 :(得分:6)

使用ASCII codes的整数列表作为接受的字符,以使用您喜欢的(伪)随机数生成器从中进行采样。然后使用chr将每个字符转换为其字符并将它们连接起来。

喜欢

perl -wE'$rw .= chr( 32+(int rand 126-32) ) for 1..4; say $rw'

注释

  • 我仅使用单线来进行简单的复制粘贴测试。请用脚本将其写得很好

  • 我使用粗略的rand,非常适合拖拉东西。如有需要,请替换为更好的

  • 粘贴四个(伪)随机数不会建立良好的分布;即使每个字母都自己写,整个事情也不是。但是这四个应该可以满足大多数需求。

    如果没有,我认为您需要产生一个更长的列表(允许的字符范围可能重复四次)并将其随机化,然后绘制四个字母的子序列。还有很多工作

  • 我需要一点点踢踏舞才能使用rand产生32到126之间的(随机数)整数,因为它只占用范围的末尾。而且,这会使所有这些对象都处于该范围内,可能不是您想要的;因此,请指定您要从中绘制的子范围或特定列表