如何在ruby中生成随机的10位数字?

qua*_*uck 61 ruby random

另外,我如何将其格式化为用零填充的字符串?

qua*_*uck 84

要生成数字调用rand,结果为"10到10的幂"

rand(10 ** 10)
Run Code Online (Sandbox Code Playgroud)

要用零填充数字,可以使用字符串格式运算符

'%010d' % rand(10 ** 10)
Run Code Online (Sandbox Code Playgroud)

或者rjust字符串的方法

rand(10 ** 10).to_s.rjust(10,'0')  
Run Code Online (Sandbox Code Playgroud)


Kre*_*eki 54

我想提供一个我认识的最简单的解决方案,这是一个非常好的技巧.

rand.to_s[2..11] 
 => "5950281724"
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,它只会给你最多16位数字. (5认同)
  • 不保证返回确切的长度 (3认同)
  • 唯一的问题是它给你一个字符串,所以如果你真的需要一个数字,那么你必须再次施放它 - 这有点乱. (2认同)

ste*_*lag 27

这是生成10大小数字字符串的快速方法:

10.times.map{rand(10)}.join # => "3401487670"
Run Code Online (Sandbox Code Playgroud)

  • 实现相同目的的更高效方法:`Array.new(10) { rand(10) }` (4认同)

art*_*pov 13

最简单的答案可能是

rand(1e9...1e10).to_i

to_i部分是必要的,因为1e91e10实际上是浮动:

irb(main)> 1e9.class
=> Float
Run Code Online (Sandbox Code Playgroud)


Kam*_*nek 9

不要使用 rand.to_s[2..11].to_i

为什么?因为这是你能得到的:

rand.to_s[2..9] #=> "04890612"
Run Code Online (Sandbox Code Playgroud)

然后:

"04890612".to_i #=> 4890612
Run Code Online (Sandbox Code Playgroud)

注意:

4890612.to_s.length #=> 7
Run Code Online (Sandbox Code Playgroud)

这不是你所期望的!

要在您自己的代码中检查该错误,而不是.to_i您可以像这样包装它:

Integer(rand.to_s[2..9])
Run Code Online (Sandbox Code Playgroud)

很快就会发现:

ArgumentError: invalid value for Integer(): "02939053"
Run Code Online (Sandbox Code Playgroud)

所以坚持下去总是更好.center,但请记住:

rand(9) 
Run Code Online (Sandbox Code Playgroud)

有时可能会给你0.

为了防止:

rand(1..9)
Run Code Online (Sandbox Code Playgroud)

这将永远返回1..9范围内的东西.

我很高兴我有很好的测试,我希望你能避免破坏你的系统.


Gab*_*rio 7

仅仅因为没有提到,该Kernel#sprintf方法(或它Kernel#formatPowerpack库中的别名)通常比该String#%方法更受欢迎,如Ruby社区风格指南中所述.

当然这是值得商榷的,但要提供见解:

@ quackingduck的答案的语法是

# considered bad
'%010d' % rand(10**10)

# considered good
sprintf('%010d', rand(10**10))
Run Code Online (Sandbox Code Playgroud)

这种偏好的本质主要是由于它的神秘性质%.它本身并不是非常语义,没有任何额外的上下文,它可以与%模运算符混淆.

样式指南中的示例:

# bad
'%d %d' % [20, 10]
# => '20 10'

# good
sprintf('%d %d', 20, 10)
# => '20 10'

# good
sprintf('%{first} %{second}', first: 20, second: 10)
# => '20 10'

format('%d %d', 20, 10)
# => '20 10'

# good
format('%{first} %{second}', first: 20, second: 10)
# => '20 10'
Run Code Online (Sandbox Code Playgroud)

为了正义String#%,我个人很喜欢使用运营商类似的语法,而不是命令,以同样的方式,你会做your_array << 'foo'your_array.push('123').

这恰恰说明了社区中的一种趋势,"最好的"取决于你.

此博客中的更多信息.


907*_*7th 7

随机数生成

使用内核#rand方法:

rand(1_000_000_000..9_999_999_999) # => random 10-digits number
Run Code Online (Sandbox Code Playgroud)

随机字符串生成

使用times+ map+ join组合:

10.times.map { rand(0..9) }.join # => random 10-digit string (may start with 0!)
Run Code Online (Sandbox Code Playgroud)

使用填充进行字符串转换的数字

使用字符串#%方法:

"%010d" % 123348 # => "0000123348"
Run Code Online (Sandbox Code Playgroud)

密码生成

使用KeePass密码生成器库,它支持生成随机密码的不同模式:

KeePass::Password.generate("d{10}") # => random 10-digit string (may start with 0!)
Run Code Online (Sandbox Code Playgroud)

可以在此处找到KeePass模式的文档.


Ant*_*nko 5

我最终使用了 Ruby 内核 srand

srand.to_s.last(10)

文档在这里:内核#srand