2012-09-25 15 views
5

SecureRandom sınıfı raylarla rasgele rakamlar oluşturmaya çalışıyor. Sadece rakamlar ve alfabeler içermeyen SecureRandom.hex ile rasgele bir sayı oluşturabilir miyiz? ÖrneğinGüvenli Rastgele altıgen basamaklar sadece

:

yerine

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

It

SecureRandom.hex(4) 
=> "95237267" 

cevap

8

check out SecureRandom için api vermelidir: Sana bir aradığınız inanıyoruz http://rails.rubyonrails.org/classes/ActiveSupport/SecureRandom.html

farklı yöntem: #random_number. # onaltılı bir onaltılık sayıyı döndürür yana

SecureRandom.random_number(a_big_number) 

, sadece sayısal karakterler içerdiği rastgele bir sonuç için sormak sıradışı olurdu.

Temel kullanım durumları için #rand kullanmanız yeterlidir.

rand(9999) 

Düzenlendi:

belirttiğim uzunlukta rastgele bir sayı üretir bir kütüphane farkında değilim ama bir yazmak yeterince basit görünüyor. İşte bu benim pas:

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

yöntem #rand_by_length bir parametre olarak bir tamsayıdır belirten uzunluğu alır ve uzunluğuna bağlı olarak en fazla basamak rasgele bir sayı üretmek için çalışır. String # center, eksik sayıları rasgele sayı karakterleriyle doldurmak için kullanılır. En kötü durum, belirtilen uzunluktaki her basamak için #rand. Bu sizin ihtiyacınıza hizmet edebilir.

+0

Teşekkür ayrılın için Daha fazla açıklamak istiyorum, aslında belirli bir uzunlukta rastgele bir sayı arıyordum Ay 8), hex benzer bir şeyi merak ederek uzunluğu kısıtlıyor, SecureRandom sadece sayı üretebilecek. SecureRandom.random_number (n) muhtemelen buna izin vermeyecek mi? [random_number] (http://rails.rubyonrails.org/classes/ActiveSupport/SecureRandom.html#M000733) – swapab

+0

Cevabın yorumunuzu temel alarak güncellendi. – rossta

+0

That's Cool ...Bu kod için çok teşekkürler ... – swapab

1

Sayısal kimlikleri iyidir çünkü telefon üzerinden okunmaları daha kolaydır (charlie için no c).

deneyin bu

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

ve bonus puan "onaltılık sayı" konulu düzeltmek için o :) olarak

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

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

kadar basit daha kolay okunması için

+0

, teşekkürler @zondo – avital

+0

Benim 1 sent: Uyarım olmadan (0..9) .to_a.sample (uzunluk) .join ' – swapab

+0

@ swap.nil neden daha iyi? – avital

İlgili konular