Подтвердить что ты не робот

Как создать случайный 10-значный номер в рубине?

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

4b9b3361

Ответ 1

Чтобы генерировать числовой вызов rand с результатом выражения "10 до степени 10"

rand(10 ** 10)

Чтобы ввести число с нулями, вы можете использовать оператор формата строки

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

или rjust метод строки

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

Ответ 2

Я хотел бы внести, пожалуй, самое простое решение, которое я знаю, что довольно неплохо.

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

Ответ 3

Это быстрый способ создания десятичной строки цифр:

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

Ответ 4

Самый простой ответ, вероятно, будет

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

Часть to_i необходима, потому что 1e9 и 1e10 фактически плавают:

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

Ответ 5

Просто потому, что он не упоминался, метод Kernel#sprintf (или его псевдоним Kernel#format в Powerpack Library) обычно предпочтительнее String#% метод, как указано в Руководстве по стилю сообщества Ruby.

Конечно, это очень спорно, но, чтобы обеспечить понимание:

Синтаксис ответа @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 << 'foo' над your_array.push('123').

Это просто иллюстрирует тенденцию в сообществе, что "лучше всего" зависит от вас.

Дополнительная информация в этом блоге.

Ответ 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

Генерация случайных чисел

Использовать метод 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, он поддерживает разные шаблоны для генерации случайного пароля:

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

Документацию для шаблонов KeePass можно найти здесь.

Ответ 8

Я просто хочу изменить первый ответ. rand (10**10) может генерировать 9-значное случайное число, если 0 на первом месте. Для обеспечения 10 точных цифр просто измените

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

конец

Ответ 9

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

'%011d' % rand(1e10)

Одно предупреждение, 1e10 - это Float, а Kernel#rand заканчивается вызовом to_i на нем, поэтому для некоторых более высоких значений у вас могут быть некоторые несоответствия. Чтобы быть более точным с литералом, вы также можете:

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

Ответ 10

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

Он генерирует случайные числа, но длина не является конкретной.

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

Ответ 11

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

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

Ответ 12

Самый простой способ генерации случайного числа n цифр -

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

создать 10-значный номер номера -

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

Ответ 13

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

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

require 'regexp-examples'

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

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

Ответ 15

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

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

Просто проверьте его на IRB ниже.

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

Ответ 16

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

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

Ответ 18

Случайные 10 номеров:

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

Ответ 19

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

  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)

Ответ 20

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

или же

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

Ответ 21

Чтобы создать случайную 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')