Как создать случайное 10-значное число в рубине? - PullRequest
57 голосов
/ 29 августа 2008

Кроме того, как я могу отформатировать ее как строку, дополненную нулями?

Ответы [ 20 ]

2 голосов
/ 25 июня 2015

Эта техника работает для любого "алфавита"

(1..10).map{"0123456789".chars.to_a.sample}.join
=> "6383411680"
2 голосов
/ 24 июня 2015

Попробуйте использовать библиотеку SecureRandom ruby.

Генерирует случайные числа, но длина не указана.

Перейдите по этой ссылке для получения дополнительной информации: http://ruby -doc.org / stdlib-2.1.2 / libdoc / securerandom / rdoc / SecureRandom.html

1 голос
/ 29 августа 2018

Просто используйте прямо ниже.

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

Просто протестируйте его на IRB ниже.

(1..1000).each { puts rand(10 ** 9...10 ** 10) }
1 голос
/ 02 августа 2017

Альтернативный ответ, используя regexp-examples рубиновый камень:

require 'regexp-examples'

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

При таком подходе нет необходимости "дополнять нулями", поскольку вы сразу генерируете String.

1 голос
/ 05 сентября 2014
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, чтобы подтвердить это.

0 голосов
/ 27 марта 2019

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

или

"#{'%010d' % rand(0..9999999999)}"

0 голосов
/ 21 января 2019

В моем случае номер должен быть уникальным в моих моделях, поэтому я добавил блок проверки.

  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)
0 голосов
/ 06 декабря 2018

Случайные 10 чисел:

require 'string_pattern'
puts "10:N".gen
0 голосов
/ 21 июня 2018

Лучше всего использовать Array.new() вместо .times.map. Рубокоп рекомендует это.

Пример:

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

0 голосов
/ 24 января 2013

Это будет работать даже на ruby ​​1.8.7:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...