2012-09-25 41 views
5

Cố gắng tạo các chữ số ngẫu nhiên với lớp đường ray SecureRandom. Chúng tôi có thể tạo một số ngẫu nhiên với SecureRandom.hex chỉ bao gồm các chữ số và không có bảng chữ cái hay không.Các chữ số thập phân an toàn ngẫu nhiên chỉ

Ví dụ:

Thay vì

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

Nó sẽ cung cấp cho

SecureRandom.hex(4) 
=> "95237267" 

Trả lời

8

Kiểm tra các api cho SecureRandom: http://rails.rubyonrails.org/classes/ActiveSupport/SecureRandom.html

Tôi tin rằng bạn đang tìm kiếm một phương pháp khác: #random_number.

SecureRandom.random_number(a_big_number) 

Vì #hex trả về số thập lục phân, sẽ không bình thường khi yêu cầu kết quả ngẫu nhiên chỉ chứa các ký tự số.

Đối với trường hợp sử dụng cơ bản, đơn giản là đủ để sử dụng #rand.

rand(9999) 

được sửa đổi:

Tôi không biết của một thư viện mà tạo ra một số ngẫu nhiên có độ dài nhất định, nhưng có vẻ như đơn giản, đủ để viết một. Đây là đường chuyền của tôi tại địa chỉ:

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

Phương thứC#rand_by_length lấy một số nguyên chỉ định chiều dài và cố gắng tạo số chữ số tối đa ngẫu nhiên dựa trên độ dài. Trung tâm chuỗi # được sử dụng để đệm các số bị thiếu với các ký tự số ngẫu nhiên. Trường hợp xấu nhất gọi #rand cho mỗi chữ số có độ dài được chỉ định. Điều đó có thể phục vụ nhu cầu của bạn.

+0

Cám ơn chỉnh trên "số thập lục" Tôi muốn giải thích thêm, tôi đã thực sự tìm kiếm một số ngẫu nhiên với độ dài cụ thể (cho phép s ay 8), hex không hạn chế chiều dài để tự hỏi một cái gì đó tương tự, SecureRandom có ​​thể có mà sẽ tạo ra số chỉ. SecureRandom.random_number (n) có lẽ sẽ không cho phép điều này? [random_number] (http://rails.rubyonrails.org/classes/ActiveSupport/SecureRandom.html#M000733) – swapab

+0

Cập nhật câu trả lời của tôi dựa trên nhận xét của bạn. – rossta

+0

Đó là Cool ... Cảm ơn rất nhiều cho mã đó ... – swapab

1

Id số là tốt vì chúng dễ đọc hơn trên điện thoại (không có c cho charlie).

Hãy thử điều này

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

và cho điểm thưởng phá vỡ nó lên cho dễ đọc

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

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

đơn giản như vậy :)

+0

quên điều đó, cảm ơn @zondo – avital

+0

1 xu của tôi: Không có dấu phẩy '(0..9) .to_a.sample (length) .join' – swapab

+0

@ swap.nil tại sao nó tốt hơn? – avital

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