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

时间:2008-08-29 16:08:48

标签: ruby random

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

23 个答案:

答案 0 :(得分:79)

使用表达式“10 to the power of 10”

的结果生成数字调用rand
rand(10 ** 10)

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

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

或字符串

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

答案 1 :(得分:51)

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

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

答案 2 :(得分:26)

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

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

答案 3 :(得分:13)

最直接的答案可能是

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

需要to_i部分,因为1e91e10实际上是花车:

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

答案 4 :(得分:7)

仅仅因为没有提到,Kernel#sprintf方法(或Powerpack Library中的别名Kernel#format)通常比{{1}更受欢迎}方法,如Ruby Community Style Guide中所述。

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

@ quackingduck的答案的语法是

String#%

这种偏好的本质主要是由于# considered bad '%010d' % rand(10**10) # considered good sprintf('%010d', rand(10**10)) 的神秘性质。它本身并不是非常语义,没有任何额外的上下文,它可能会与%模运算符混淆。

Style Guide

中的示例
%

为了为# 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 << 'foo'一样。

这只是说明了社区的一种趋势,最好的&#34;最好的&#34;由你决定。

this blogpost中的更多信息。

答案 5 :(得分:7)

随机数生成

使用Kernel#rand方法:

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

随机字符串生成

使用times + map + join组合:

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

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

使用String#%方法:

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

密码生成

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

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

可以找到KeePass模式的文档here

答案 6 :(得分:6)

请勿使用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"

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

rand(9) 

有时可能会给你0

为了防止:

rand(1..9)

将始终返回1..9范围内的内容。

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

答案 7 :(得分:3)

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

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

答案 8 :(得分:2)

这是一个表达式,它将比quackingduck的示例使用少一个方法调用。

'%011d' % rand(1e10)

有一点需要注意,1e10Float,而Kernel#rand最终会在其上调用to_i,因此对于某些较高的值,您可能会遇到一些不一致的问题。为了更精确地使用文字,你也可以这样做:

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

答案 9 :(得分:2)

我最终使用了Ruby内核srand

srand.to_s.last(10)

此处的文档:Kernel#srand

答案 10 :(得分:2)

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

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

生成10位数字 -

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

答案 11 :(得分:2)

此技术适用于任何&#34;字母表&#34;

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

答案 12 :(得分:2)

尝试使用SecureRandom ruby​​库。

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

请浏览此链接以获取更多信息:http://ruby-doc.org/stdlib-2.1.2/libdoc/securerandom/rdoc/SecureRandom.html

答案 13 :(得分:1)

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控制台中

确认。

答案 14 :(得分:1)

另一个答案,使用regexp-examples ruby​​ gem:

require 'regexp-examples'

/\d{10}/.random_example # => "0826423747"

没有必要用零填充&#34;使用这种方法,因为您立即生成String

答案 15 :(得分:1)

只需在下面使用简单明了。

rand(10 ** 9...10 ** 10)

只需使用以下内容在IRB上进行测试。

(1..1000).each { puts rand(10 ** 9...10 ** 10) }

答案 16 :(得分:0)

更好的方法是使用Array.new()代替.times.map。 Rubocop推荐它。

示例:

string_size = 9
Array.new(string_size) do
   rand(10).to_s
end

Rubucop,TimesMap:

https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Performance/TimesMap

答案 17 :(得分:0)

随机10个数字:

require 'string_pattern'
puts "10:N".gen

答案 18 :(得分:0)

在我的情况下,模型中的编号必须唯一,因此我添加了检查块。

  module StringUtil
    refine String.singleton_class do
      def generate_random_digits(size:)
        proc = lambda{ rand.to_s[2...(2 + size)] }
        if block_given?
          loop do
            generated = proc.call
            break generated if yield(generated) # check generated num meets condition
          end
        else
          proc.call
        end
      end
    end
  end
  using StringUtil
  String.generate_random_digits(3) => "763"
  String.generate_random_digits(3) do |num|
    User.find_by(code: num).nil?
  end => "689"(This is unique in Users code)

答案 19 :(得分:0)

x = [item for sublist in data['isotherm']['Relative_Pressure'].values for item in sublist]

('%010d' % rand(0..9999999999)).to_s

答案 20 :(得分:0)

要生成一个随机的10位数字字符串:

# This generates a 10-digit string, where the
# minimum possible value is "0000000000", and the
# maximum possible value is "9999999999"
SecureRandom.random_number(10**10).to_s.rjust(10, '0')

这是正在发生的事情的更多细节,通过将单行分成多行并解释变量来显示:

  # Calculate the upper bound for the random number generator
  # upper_bound = 10,000,000,000
  upper_bound = 10**10

  # n will be an integer with a minimum possible value of 0,
  # and a maximum possible value of 9,999,999,999
  n = SecureRandom.random_number(upper_bound)

  # Convert the integer n to a string
  # unpadded_str will be "0" if n == 0
  # unpadded_str will be "9999999999" if n == 9_999_999_999
  unpadded_str = n.to_s

  # Pad the string with leading zeroes if it is less than
  # 10 digits long.
  # "0" would be padded to "0000000000"
  # "123" would be padded to "0000000123"
  # "9999999999" would not be padded, and remains unchanged as "9999999999"
  padded_str = unpadded_str.rjust(10, '0')

答案 21 :(得分:0)

这甚至可以在ruby 1.8.7上运行:

  

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

答案 22 :(得分:0)

我做了这样的事情

x = 10  #Number of digit
(rand(10 ** x) + 10**x).to_s[0..x-1]