ActivePerlに付属していない追加のモジュールを使用せずにPerlを使用して、0からFまでの8文字の文字列を作成するにはどうすればよいですか。例0F1672DA
?パディングは制御可能である必要があり、正確に8文字が望ましいです。
生成したい文字列の種類のその他の例:
28DA9782
55C7128A
ActivePerlに付属していない追加のモジュールを使用せずにPerlを使用して、0からFまでの8文字の文字列を作成するにはどうすればよいですか。例0F1672DA
?パディングは制御可能である必要があり、正確に8文字が望ましいです。
生成したい文字列の種類のその他の例:
28DA9782
55C7128A
原則として、あなたはできるはずです
#!/usr/bin/env perl
use strict; use warnings;
for (1 .. 10) {
printf "%08X\n", rand(0xffffffff);
}
perl
ただし、少なくともいくつかのs(すべてではないにしても)を備えた一部のシステムでは、の範囲がrand
32,768の値に制限されていることに気付くかもしれません。
String :: Randomのソースコードを調べて、他の条件を満たすランダムな文字列を生成する方法を学ぶこともできます。
ただし、組み込みのrand
Windowsシステムを使用することに対する私の注意は依然として有効です。高品質の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]
一般的な例、任意の範囲の文字を許可する:
my @chars = ('0'..'9', 'A'..'F');
my $len = 8;
my $string;
while($len--){ $string .= $chars[rand @chars] };
print "$string\n";
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()関数の制限を克服するためのスキーマを示しています...
sprintf
数値を16進数に変換するために使用します。
$foo .= sprintf("%x", rand 16) for 1..8;