2012-04-26 10 views
6

पर्ल का उपयोग करके, किसी भी अतिरिक्त मॉड्यूल का उपयोग किए बिना जो ActivePerl के साथ नहीं आता है, मैं 0-एफ से 8 वर्णों की स्ट्रिंग कैसे बना सकता हूं। उदाहरण 0F1672DA? पैडिंग को नियंत्रित किया जाना चाहिए और वास्तव में 8 वर्ण बेहतर हैं।पर्ल में, मैं आठ हेक्स अंकों वाले यादृच्छिक तार कैसे उत्पन्न कर सकता हूं?

अधिक तार के प्रकारों के उदाहरण मैं चाहते हैं उत्पन्न करने के लिए:

28DA9782 
55C7128A 
+5

गोल्फ: 'perl -e'print [0..9, ए..एफ ] -> [रैंड 16] 1..8'' – daxim

+1

क्यों डाउनवॉटिंग? मुझे प्रोग्रामिंग सीखने की ज़रूरत है। इस प्रकार के प्रश्नों के लिए स्टैक ओवरफ्लो क्या है? – unixman83

+4

मैंने आपकी पोस्ट को वोट नहीं दिया। हालांकि, आम तौर पर, किसी भी सीपीएएन मॉड्यूल को बाहर करने पर अनुकूलता नहीं देखी जाती है। इसके अलावा, आपको अपने स्वयं के समाधान के साथ आने का कुछ प्रयास करने की उम्मीद है, और दूसरों को डिब्बाबंद समाधान देने की अपेक्षा करने के बजाय इसके साथ मदद मांगा जाए। –

उत्तर

15

सिद्धांत रूप में, आप

#!/usr/bin/env perl 

use strict; use warnings; 

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

करने के लिए हालांकि सक्षम होना चाहिए, तो आप उस — कम से कम कुछ perl रों कि कुछ सिस्टम पर (यदि सभी नहीं) — range of rand is restricted to 32,768 values पता चल सकता है।

आप अन्य परिस्थितियों को संतोषजनक तारों को उत्पन्न करने के तरीके को जानने के लिए String::Random के स्रोत कोड का भी अध्ययन कर सकते हैं।

हालांकि, विंडोज सिस्टम पर rand में निर्मित का उपयोग करने के खिलाफ मेरा सावधानी अभी भी खड़ा है। उच्च गुणवत्ता वाले आरएनजी के लिए 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"; 

पुनश्च: The issue with Perl's rand on Windows was fixed in 5.20:

मतलब यह कि पर्ल के यादृच्छिक संख्या की गुणवत्ता POSIX प्लेटफार्मों पर 48-बिट करने के लिए Windows पर रैंड() के 15 बिट्स से, मंच के लिए मंच से अलग-अलग होगी जैसे ड्रैंड 48() के साथ लिनक्स।

पर्ल अब सभी प्लेटफार्मों पर अपने आंतरिक ड्रैंड 48() कार्यान्वयन का उपयोग करता है। यह perl की रैंड क्रिप्टोग्राफिक रूप से सुरक्षित नहीं बनाता है। [पर्ल # 115,928]

+0

निश्चित रूप से एक प्लगइन है जो ActivePerl के साथ आता है जो 'रैंड' की सीमा को खत्म करता है? – unixman83

+0

'रैंड' चेतावनी – unixman83

+1

के लिए +1 क्या एक समाधान एक समय में 1 अंकों के लिए 'रैंड' का उपयोग करेगा? क्या आपका दूसरा उदाहरण यह करता है? – unixman83

4

उपयोग sprintf हेक्स के लिए संख्या परिवर्तित करने के लिए।

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

+1 – unixman83

7

जनरल उदाहरण के लिए, की अनुमति के वर्णों के किसी भी सीमा:

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

कुछ लोगों MAX-मूल्य रैंड की (0x7FFF) के साथ रैंड की खिड़कियों सीमा का उल्लेख या रैंड (32768) दशमलव, मैं इस द्विआधारी स्थानांतरण-ऑपरेटर '< <'

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

साथ काबू पाने होगा लेकिन मैं इस पर विचार करें अकादमिक के रूप में ly, क्योंकि यह वास्तव में अजीब कोड है जो समझना मुश्किल है।
मैं इसका उपयोग वास्तविक जीवन कोड में नहीं करूँगा, केवल तभी जब गति सबसे अधिक हो।
लेकिन शायद यह सबसे तेज़ समाधान है और यह रैंड() - खिड़कियों के नीचे फ़ंक्शन की सीमा को दूर करने के लिए एक स्कीमा का प्रदर्शन कर रहा है ...

+0

यह @Sinan के अनुसार काम नहीं करेगा। 'रैंड' की रेंज केवल 32,768 है! – unixman83

+3

मेरा कथन कुछ हद तक कमजोर था: * कम से कम कुछ विंडोज सिस्टम पर, 'रैंड' की सीमा 32,768 मानों तक सीमित हो सकती है। –

+0

हाँ मैंने ब्लॉग पढ़ा। –

संबंधित मुद्दे

 संबंधित मुद्दे