2010-12-06 13 views
5

में इतना यादृच्छिक नहीं है मेरे पास एक पर्ल स्क्रिप्ट है जो मुझे यादृच्छिक संख्या, अक्षरों और कुछ विशेष पात्रों की एक 50 वर्ण स्ट्रिंग प्रदान करती है। मैं उन्हें डेटाबेस में इनपुट कर रहा हूं। अब, स्ट्रिंग की लंबाई और वर्णों की मात्रा दी गई, मुझे नहीं लगता कि डुप्लिकेट आसानी से बनाए जाएंगे।रैंड() perl

my $random_id=''; 
my @c = ("A" .. "Z", "a" .. "z", 0 .. 9, qw(! @ $ %^& *)); 
$random_id = join '', map $c[rand @c] , 1 .. 50; 

ऐसा लगता है कि तार का उत्पादन:

यहाँ कि स्ट्रिंग बनाता है कोड का निफ्टी का डला है!

C1Qt8L7E7QUD% lkxnh9yjZ2njF0iMj 1o^4DmTbVNhQB9% DKE @

समस्या यह है कि यह अद्वितीय रूप से एक बार और कुछ समय में एक सटीक स्ट्रिंग को डुप्लिकेट करेगा, और कुछ तारों पर एक से अधिक बार। और यह 20 तारों से बाहर है। यह विचित्र है। मैं इसके चारों ओर काम कर सकता हूं और एक समाधान ढूंढ सकता हूं ... लेकिन यह मुझे थोड़ा परेशान करता है। जानना चाहते हैं क्यों। किसी के पास कोई विचार है?

उत्तर

8

आपको यादृच्छिक संख्या जनरेटर को बीज करने के लिए srand का उपयोग करने की आवश्यकता है अन्यथा यह समान संख्या श्रृंखला उत्पन्न करेगा।

http://perldoc.perl.org/functions/srand.html

संपादित करें:

यूआरएल atthe दस्तावेज़ के अनुसार, पर्ल संस्करण 5.004 से पहले है तो यह अपने आप उस फ़ंक्शन को कॉल नहीं होंगे। तो आप जिस पर्ले संस्करण के तहत चल रहे हैं उसे जांचें।

+0

हाय पॉल। टिप्पणी के लिए धन्यवाद! – DataHerder

+0

वूप्स ... को जवाब नहीं मिला। अगर मैं रैंड() को srand() में बदलता हूं तो यह अब पूरी तरह से बीबीबीबीबीबीबीबीबीबीबी आउटपुट करता है .. हर बार। : – DataHerder

+0

perl 5.1 जिस तरह से – DataHerder

3

आप पैटर्न पर आधारित यादृच्छिक तार उत्पन्न करने के लिए String::Random भी देख सकते हैं।

+1

डेटा :: यूयूआईडी (http://search.cpan.org/dist/Data-UUID/) जैसे कुछ भी डेटाबेस में स्ट्रिंग का उपयोग किया जा रहा है (जैसे निरंतर अद्वितीय प्राथमिक कुंजी) – plusplus

+0

@ प्लसप्लस लेकिन यह कीड़े के कर खोल रहा है: "क्या यूयूआईडी [कभी] प्राथमिक कुंजी होनी चाहिए?" :-) –

3

अच्छी यादृच्छिक संख्याओं के लिए, Math::Random::MT का उपयोग करने पर विचार करें।

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