8

尝试使用 SecureRandom 类轨道生成随机数字。我们能否使用 SecureRandom.hex 创建一个仅包含数字且不包含字母的随机数。

例如:

代替

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

它应该给

SecureRandom.hex(4)
=> "95237267"
4

4 回答 4

10

查看 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 方法将指定长度的整数作为参数,并尝试根据长度生成随机数的最大位数。String#center 用于用随机数字字符填充缺失的数字。最坏的情况为指定长度的每个数字调用#rand。这可能会满足您的需求。

于 2012-09-25T11:49:19.733 回答
1

数字 id 很好,因为它们更容易通过电话阅读(查理没有 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"
于 2014-01-23T16:49:11.507 回答
0
length = 4

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

就如此容易 :)

于 2016-05-17T07:10:59.783 回答
0

这将创建一些所需的长度。

length = 11

rand(10**length..(10**length+1)-1).to_s
于 2021-11-08T12:05:30.677 回答