12

ActivePerlに付属していない追加のモジュールを使用せずにPerlを使用して、0からFまでの8文字の文字列を作成するにはどうすればよいですか。例0F1672DA?パディングは制御可能である必要があり、正確に8文字が望ましいです。

生成したい文字列の種類のその他の例:

28DA9782
55C7128A
4

4 に答える 4

20

原則として、あなたはできるはずです

#!/usr/bin/env perl

use strict; use warnings;

for (1 .. 10) {
    printf "%08X\n", rand(0xffffffff);
}

perlただし、少なくともいくつかのs(すべてではないにしても)を備えた一部のシステムでは、の範囲がrand32,768の値に制限されていることに気付くかもしれません。

String :: Randomのソースコードを調べて、他の条件を満たすランダムな文字列を生成する方法を学ぶこともできます。

ただし、組み込みのrandWindowsシステムを使用することに対する私の注意は依然として有効です。高品質のRNGについては、Math :: Random::MTを参照してください。

#!/usr/bin/env perl

use strict; use warnings;

my @set = ('0' ..'9', 'A' .. 'F');
my $str = join '' => map $set[rand @set], 1 .. 8;
print "$str\n";

PS:WindowsでのPerlのランドの問題は5.20で修正されました

つまり、perlの乱数の品質は、プラットフォームごとに異なります。Windowsの15ビットのrand()から、drand48()を使用するLinuxなどのPOSIXプラットフォームの48ビットまでです。

Perlは現在、すべてのプラットフォームで独自の内部drand48()実装を使用しています。これは、perlのランドを暗号的に安全にするものではありません。[perl#115928]

于 2012-04-26T15:39:34.077 に答える
11

一般的な例、任意の範囲の文字を許可する:

my @chars = ('0'..'9', 'A'..'F');
my $len = 8;
my $string;
while($len--){ $string .= $chars[rand @chars] };
print "$string\n";
于 2012-04-26T15:40:04.967 に答える
5
sprintf("%08X", rand(0xFFFFFFFF))

一部の人々は、rand(0x7FFF)またはrand(32768)の10進数のMAX値でrandのwindows-limitに言及しました。私は、バイナリシフト演算子'<<'でこれを克服します。

# overcomes the windows-rand()-only-works-with-max-15bit-(32767)-limitation:
#   needed 8*4==32bit random-number:
#     first get the 15 high-significant bits shift them 17bits to the left,
#     then the next 15bits shifted 2 bits to the left,
#     then the last 2 bits with no shifting:
printf( '%08X', (
    (rand(0x8000)<<17) + (rand(0x8000)<<2) + rand(0b100) )
      );

しかし、私はこれを学術的なものとしか考えていません。なぜなら、それは本当に理解しにくい厄介なコードだからです。
速度が最も重要な場合にのみ、これを実際のコードでは使用しません。
しかし、おそらくそれは最速の解決策であり、ウィンドウの下でのrand()関数の制限を克服するためのスキーマを示しています...

于 2012-04-26T15:40:50.503 に答える
4

sprintf数値を16進数に変換するために使用します。

$foo .= sprintf("%x", rand 16) for 1..8;
于 2012-04-26T15:39:19.490 に答える