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

另外,我如何将它格式化为一个用零填充的string?

为了生成号码调用rand,结果expression式为“10的幂的10”

rand(10 ** 10) 

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

 '%010d' % rand(10 ** 10) 

或string的调整方法

 rand(10 ** 10).to_s.rjust(10,'0') 

我想贡献一个我知道的最简单的解决scheme,这是一个很好的窍门。

 rand.to_s[2..11] => "5950281724" 

这是生成10个string的一个快速方法:

 10.times.map{rand(10)}.join # => "3401487670" 

最直接的答案可能是

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

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

 irb(main)> 1e9.class => Float 

仅仅因为没有提到,在Ruby社区风格指南中提到的Kernel#sprintf方法(或者它在Powerpack库中是别名Kernel#format )通常优于String#%方法。

当然,这是非常有争议的,但提供的见解:

@ quackingduck的答案的语法是

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

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

样式指南中的示例:

 # 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' 

为了使String#% ,我个人真的很喜欢使用类似于运算符的语法而不是命令,就像在your_array.push('123')your_array << 'foo' your_array.push('123')

这只是说明社区的一种趋势,什么是“最好”取决于你。

更多信息在这个博客 。

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

为什么? 因为这里是你可以得到的:

 rand.to_s[2..9] #=> "04890612" 

接着:

 "04890612".to_i #=> 4890612 

注意:

 4890612.to_s.length #=> 7 

这不是你所期望的!

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

 Integer(rand.to_s[2..9]) 

很快就会发现:

 ArgumentError: invalid value for Integer(): "02939053" 

所以坚持中心永远是最好的,但请记住:

 rand(9) 

有时可能会给你0

为了防止:

 rand(1..9) 

这将始终返回1..9范围内的东西。

我很高兴我有很好的testing,我希望你能避免打破你的系统。

这种技术适用于任何“字母”

 (1..10).map{"0123456789".chars.to_a.sample}.join => "6383411680" 

下面是一个expression式,将使用比quackingduck的示例更less的方法调用。

 '%011d' % rand(1e10) 

需要注意的是, 1e10是一个Float ,而Kernel#rand最终会调用to_i ,所以对于一些更高的值你可能会有一些不一致的地方。 为了更精确的文字,你也可以这样做:

 '%011d' % rand(10_000_000_000) # Note that underscores are ignored in integer literals 

我只是想修改第一个答案。 rand (10**10)可能会产生9位随机数,如果0是在第一位。 为了确保10个确切的数字只是修改

 code = rand(10**10) while code.to_s.length != 10 code = rand(11**11) 

结束

这将工作,即使在ruby1.8.7:

rand(9999999999).to_s.center(10,rand(9).to_s).to_i

 rand(9999999999).to_s.center(10, rand(9).to_s).to_i 

比…更快

 rand.to_s[2..11].to_i 

您可以使用:

 puts Benchmark.measure{(1..1000000).map{rand(9999999999).to_s.center(10, rand(9).to_s).to_i}} 

 puts Benchmark.measure{(1..1000000).map{rand.to_s[2..11].to_i}} 

在Rails控制台中确认。

最简单的方法来生成n位数的随机数 –

 Random.new.rand((10**(n - 1))..(10**n)) 

生成10位数字号码 –

 Random.new.rand((10**(10 - 1))..(10**10)) 

随机数生成

使用Kernel#rand方法:

 rand(1_000_000_000..9_999_999_999) # => random 10-digits number 

随机string生成

使用times + map + join组合:

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

数字到string转换与填充

使用String#%方法:

 "%010d" % 123348 # => "0000123348" 

密码生成

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

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

KeePass模式的文档可以在这里find。

一个替代的答案,使用正则regexp-examplesrubygem:

 require 'regexp-examples' /\d{10}/.random_example # => "0826423747" 

这种方法不需要“用零填充”,因为您立即生成一个String

尝试使用SecureRandom ruby​​库。

它会生成随机数字,但长度不是特定的。

通过这个链接了解更多信息: http : //ruby-doc.org/stdlib-2.1.2/libdoc/securerandom/rdoc/SecureRandom.html