2012-09-25 13 views
5

रेल के SecureRandom वर्ग के साथ यादृच्छिक अंक उत्पन्न करने का प्रयास कर रहा है। क्या हम SecureRandom.hex के साथ एक यादृच्छिक संख्या बना सकते हैं जिसमें केवल अंक और कोई वर्णमाला शामिल नहीं है।सुरक्षित रैंडम हेक्स अंक केवल

उदाहरण के लिए:

SecureRandom.hex(4) 
=> "95bf7267" 

के बजाय यह SecureRandom के लिए एपीआई देना चाहिए

SecureRandom.hex(4) 
=> "95237267" 

उत्तर

8

चेक आउट: http://rails.rubyonrails.org/classes/ActiveSupport/SecureRandom.html

मेरा मानना ​​है कि आप एक के लिए देख रहे अलग विधि: #random_number।

SecureRandom.random_number(a_big_number) 

के बाद से #hex एक हेक्साडेसिमल संख्या देता है, यह एक यादृच्छिक नतीजा यह है कि केवल संख्यात्मक वर्ण निहित लिए पूछने के लिए असामान्य होगा।

मूल उपयोग के मामलों के लिए, #rand का उपयोग करना काफी आसान है।

rand(9999) 

संपादित:

मैं एक पुस्तकालय है कि निर्दिष्ट लंबाई के एक यादृच्छिक संख्या उत्पन्न करता है के बारे में पता नहीं कर रहा हूँ, लेकिन यह काफी सरल एक लिखने के लिए लगता है। यहाँ यह पर मेरे पास है:

def rand_by_length(length) 
    rand((9.to_s * length).to_i).to_s.center(length, rand(9).to_s).to_i 
end 

विधि #rand_by_length का कोई पैरामीटर के रूप में एक पूर्णांक निर्दिष्ट लंबाई लेता है और लंबाई के आधार पर अधिकतम अंकों के एक यादृच्छिक संख्या उत्पन्न करने के लिए कोशिश करता है। स्ट्रिंग # केंद्र का प्रयोग यादृच्छिक संख्या वर्णों के साथ गायब संख्याओं को पैड करने के लिए किया जाता है। सबसे खराब मामला निर्दिष्ट लंबाई के प्रत्येक अंक के लिए #rand कॉल करता है। यह आपकी ज़रूरत को पूरा कर सकता है।

+0

धन्यवाद के लिए मैं इसे और समझाऊंगा, मैं वास्तव में विशिष्ट लंबाई के साथ एक यादृच्छिक संख्या की तलाश में था (चलो एस ए 8), हेक्स लंबाई को प्रतिबंधित करता है, इसलिए कुछ ऐसा सोच रहा है, सिक्योररैंडम में केवल संख्याएं उत्पन्न होंगी। SecureRandom.random_number (n) शायद यह अनुमति नहीं देगा? [random_number] (http://rails.rubyonrails.org/classes/ActiveSupport/SecureRandom.html#M000733) – swapab

+0

आपकी टिप्पणी के आधार पर मेरा उत्तर अपडेट किया गया। – rossta

+0

यह कूल है ... धन्यवाद उस कोड के लिए बहुत कुछ ... – swapab

1

संख्यात्मक आईडी अच्छी है क्योंकि फ़ोन पर पढ़ने के लिए उन्हें आसान है (चार्ली के लिए कोई सी नहीं)।

प्रयास करें इस

length = 20 
id = (SecureRandom.random_number * (10**length)).round.to_s # => "98075825200269950976" 

और बोनस अंक "हेक्साडेसिमल संख्या" पर सही करने के लिए आसानी से पढ़ने के

id.split(//).each_slice(4).to_a.map(&:join).join('-') # => "9807-5825-2002-6995-0976" 
1
length = 4 

[*'0'..'9'].sample(length).join 

के रूप में है कि :) के रूप में सरल के लिए इसे तोड़ने के

+0

भूल गया, धन्यवाद @ ज़ोंडो – avital

+0

मेरा 1 प्रतिशत: बिना स्प्लट '(0..9) .to_a.sample (लंबाई)। Join' – swapab

+0

@ swap.nil यह बेहतर क्यों है? – avital

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