SecureRandom クラスのレールで乱数を生成しようとしています。SecureRandom.hex を使用して、数字のみでアルファベットを含まない乱数を作成できますか。
例えば:
それ以外の
SecureRandom.hex(4)
=> "95bf7267"
それは与えるべきです
SecureRandom.hex(4)
=> "95237267"
SecureRandom クラスのレールで乱数を生成しようとしています。SecureRandom.hex を使用して、数字のみでアルファベットを含まない乱数を作成できますか。
例えば:
それ以外の
SecureRandom.hex(4)
=> "95bf7267"
それは与えるべきです
SecureRandom.hex(4)
=> "95237267"
SecureRandom の API を確認してください: http://rails.rubyonrails.org/classes/ActiveSupport/SecureRandom.html
別の方法を探していると思います: #random_number.
SecureRandom.random_number(a_big_number)
#hex は 16 進数を返すため、数字のみを含むランダムな結果を要求することは通常ありません。
基本的な使用例では、#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 は長さを指定する整数をパラメーターとして取り、長さに基づいて最大桁数の乱数を生成しようとします。String#center は、欠落している数字を乱数文字で埋めるために使用されます。最悪の場合、指定された長さの各桁に対して #rand を呼び出します。それはあなたの必要性に役立つかもしれません。
数字の ID は電話で読みやすいので良いです (charlie には c はありません)。
これを試して
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"
length = 4
[*'0'..'9'].sample(length).join
それと同じくらい簡単です:)