2012-09-25 59 views
5

尝试使用SecureRandom类的导轨生成随机数字。我们可以用SecureRandom.hex创建一个只包含数字和没有字母的随机数字。安全随机十六进制数字

例如:

而不是

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

它应该给

SecureRandom.hex(4) 
=> "95237267" 

回答

8

检查出的SecureRandom的API: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接受一个整数,指定长度为PARAM和尝试生成的基于长度最大位数的随机数。字符串#center用于用随机数字填充缺失的数字。最坏情况下,每个指定长度的数字都会调用#rand。这可能会满足您的需求。

+0

感谢的 “十六进制数” 纠正 我想进一步解释它,我实际上是在寻找一个具有特定长度的随机数(让s ay 8),hex限制了长度,所以想知道类似的东西,SecureRandom可能只会产生数字。 SecureRandom.random_number(n)可能不会允许这个? [random_number](http://rails.rubyonrails.org/classes/ActiveSupport/SecureRandom.html#M000733) – swapab

+0

根据您的评论更新我的答案。 – rossta

+0

这很酷... 非常感谢那个代码... – swapab

1

数字身份证是好的,因为他们更容易通过电话阅读(查理没有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" 
1
length = 4 

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

为:)简单

+0

忘记了,谢谢@zondo – avital

+0

我的1分:没有图示'(0..9).to_a.sample(length).join' – swapab

+0

@ swap.nil为什么它更好? – avital

相关问题