输入的随机输出

输入的随机输出

相关问题:如何根据用户输入创建随机输出

我想从用户那里获取输入(只有一个参数),就像Hello.而且,我想给出类似的输出

olleho
llohe
he
llo
lo

就像上面一样。而且,我想从单个输入中生成数百万个样本。我想将这些文本保存在 txt 格式的文件中。怎么做?


假设我将我的电子邮件地址作为参数`[电子邮件受保护]`。所以,现在我想使这个帐户的相关密码成为可能。下面给出一些示例输出:
[email protected]
Istiakshovon
Istiak
Ishovon
Ishovon0
Iksgc
gmail
moc

我想尽可能以各种可能的方式创建示例密码。


我添加了标签原因,我注意到很多人使用“awk”格式化文本。我对它不太熟悉(我只是一个 Linux 初学者)。这就是我添加它的原因。

答案1

假设用户的输入位于 变量 中userinput,那么以下awk代码将生成该输入的永无止境的随机采样。

userinput=$userinput awk '
    BEGIN {
        s = ENVIRON["userinput"] "\n"
        n = length(s)
        while (1)
            printf "%s", substr(s,int(1+rand()*n),1)
    }'

这将获取 的值$userinput,在字符串末尾添加一个换行符,然后开始从该字符串写入随机字符,直到中断代码。添加的换行符确保我们每隔一段时间就会在输出中得到换行符。

使用head命令您可以限制输出的行数。如果您想要 1000 行,请通过管道输出head -n 1000。使用以下命令测试前 10 行输出userinput='Hello World!'

$ userinput='Hello World!'
$ userinput=$userinput awk '
    BEGIN {
        s = ENVIRON["userinput"] "\n"
        n = length(s)
        while (1)
            printf "%s", substr(s,int(1+rand()*n),1)
    }' | head
ld l!lodd loWHe! o
H lolooel
o
eo !lll
WrlHellHod
rlll
o!Hddrd

l!lHelWloodWddeodldHHlo!d l ll oorordeoellrWHledW!!WrW W!l
l!od

如果要删除空行,请将输出传递给sed '/./!d'.

该命令的一个变体,从输入的第一行获取输入字符串:

awk '{
        s = $0 "\n"
        n = length(s)
        while (1)
            printf "%s", substr(s,int(1+rand()*n),1)
    }'

答案2

使用 Perl 和算法::置换库模块:

#!/usr/bin/perl

use strict;
use Algorithm::Permute qw(permute);

my $string = 'hello';
my @array = split //, $string;
permute { print join("",@array), "\n" } @array;
$ ./permute.pl | head
hello
helol
heoll
hoell
ohell
hello
helol
heoll
hoell
ohell

上面的版本仅打印与原始长度相同的排列。

以下版本执行从长度 1 到相同长度的所有排列:

#!/usr/bin/perl

use strict;
use Algorithm::Permute;

my $string = shift; # New & Improved! Now takes an argument!

# un-comment only ONE of the following two lines:
#for my $i (reverse 1 .. length($string)) {
for my $i (1 .. length($string)) {

  my $p = Algorithm::Permute->new([split //, $string], $i);
  while (my @res = $p->next) {
    print join('',@res), "\n";
  };
};

另存为,例如permute.pl。使可执行文件chmod +x permute.pl并运行如下:

$ ./permute.pl hello

注1:事实证明存在一个已知的错误进行完全排列时原始数组被清空在 Algorithm::Permute 模块中,该模块会擦除调用它的数组。

这绝对是非 Perl 行为,可能是因为该模块不是本机 Perl,它是编译后的 C 函数的薄 Perl 包装器......并且 C 函数是以破坏数组的方式编写的。

不管怎样,这就是为什么我去掉了这条my @array = split //, $string线,并用来[split //, $string]为该Algorithm::Permute->new()方法生成一个匿名数组。这确保了每次循环时都会重新创建数组。

通常,如果数组没有(或不应该)在循环内修改,则应该在循环外仅创建它一次。

注 2:如果要反转输出的顺序,请将脚本的输出通过管道传输到tac,或将脚本中的 for 循环更改为:

for my $i (reverse 1 .. length($string)) {

这样做让我注意到了这个错误。上面的更新版本现在可以使用或不使用reverse.

相关内容