2012-04-26 27 views
6

Sử dụng Perl, không sử dụng bất kỳ mô-đun bổ sung nào không đi kèm với ActivePerl, làm cách nào tôi có thể tạo chuỗi gồm 8 ký tự từ 0-F. ví dụ 0F1672DA? Các padding nên được kiểm soát và chính xác 8 ký tự là thích hợp hơn.Trong Perl, làm cách nào để tạo chuỗi ngẫu nhiên bao gồm tám chữ số thập phân?

Nhiều ví dụ về các loại dây Tôi muốn tạo ra:

28DA9782 
55C7128A 
+5

Golf: 'perl -e'print [0..9, A..F ] -> [rand 16] đối với 1,.8'' – daxim

+1

Tại sao phải xuống hạng? Tôi cần học lập trình. Stackoverflow là gì nếu không phải là loại câu hỏi này? – unixman83

+4

Tôi không bỏ phiếu cho bài đăng của bạn. Tuy nhiên, nói chung, việc loại trừ bất kỳ mô-đun CPAN nào cũng không được xem xét một cách thuận lợi. Ngoài ra, bạn dự kiến ​​sẽ thực hiện một số nỗ lực để đưa ra một giải pháp của riêng bạn, và yêu cầu giúp đỡ với điều đó hơn là mong đợi những người khác cung cấp cho bạn các giải pháp đóng hộp. –

Trả lời

15

Về nguyên tắc, bạn nên để có thể làm

#!/usr/bin/env perl 

use strict; use warnings; 

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

Tuy nhiên, bạn có thể tìm ra rằng — ít nhất là trên một số hệ thống với một số perl s (nếu không nói là tất cả) — các range of rand is restricted to 32,768 values.

Bạn cũng có thể nghiên cứu mã nguồn của String::Random để tìm hiểu cách tạo chuỗi ngẫu nhiên đáp ứng các điều kiện khác.

Tuy nhiên, sự thận trọng của tôi đối với việc sử dụng được xây dựng trong rand trên hệ thống Windows vẫn là viết tắt. Xem Math::Random::MT để có RNG chất lượng cao.

#!/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: The issue with Perl's rand on Windows was fixed in 5.20:

Điều này có nghĩa rằng chất lượng của số ngẫu nhiên perl của sẽ thay đổi từ nền tảng đến nền tảng, từ 15 bit của rand() trên Windows 48-bit trên nền tảng POSIX chẳng hạn như Linux với drand48().

Perl hiện sử dụng triển khai drand48() nội bộ của riêng mình trên tất cả các nền tảng. Điều này không đảm bảo an toàn cho mật mã của perl. [Perl # 115.928]

+0

Chắc chắn có một plugin đi kèm với ActivePerl vượt qua giới hạn của 'rand'? – unixman83

+0

+1 cho cảnh báo 'rand' – unixman83

+1

Một giải pháp có thể sử dụng' rand' cho 1 chữ số tại một thời điểm không? Ví dụ thứ hai của bạn có làm được điều này không? – unixman83

4

Sử dụng sprintf để chuyển đổi số để hex.

$foo .= sprintf("%x", rand 16) for 1..8; 
+0

+1 cho sự đơn giản – unixman83

7

dụ chung, cho phép bất kỳ phạm vi của các nhân vật:

my @chars = ('0'..'9', 'A'..'F'); 
my $len = 8; 
my $string; 
while($len--){ $string .= $chars[rand @chars] }; 
print "$string\n"; 
4
sprintf("%08X", rand(0xFFFFFFFF)) 

một số người đề cập đến cửa sổ hạn không quá rand với MAX-Giá trị của rand (0x7FFF) hoặc rand (32768) chữ số thập phân, tôi sẽ khắc phục điều này với nhị phân chuyển-vận hành '< <'

# 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)) 
    ); 

Nhưng tôi xem xét việc này trên ly như học tập, bởi vì nó thực sự là mã vụng về khó hiểu.
Tôi sẽ không sử dụng mã này trong mã thực tế, chỉ khi tốc độ lớn nhất.
Nhưng có lẽ đó là giải pháp nhanh nhất và nó thể hiện một lược đồ để vượt qua giới hạn của rand() - chức năng dưới cửa sổ ...

+0

Điều này sẽ không hoạt động theo @Sinan. Phạm vi của 'rand' chỉ còn 32.768! – unixman83

+3

Tuyên bố của tôi yếu hơn một chút: * Trên ít nhất một số hệ thống Windows, phạm vi của 'rand' có thể bị giới hạn ở 32.768 giá trị. –

+0

yea tôi đã đọc blog. –

Các vấn đề liên quan