Кроме того, как я могу отформатировать его как строку с нулями?
Как создать случайный 10-значный номер в рубине?
Ответ 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
Ответ 17
Лучшим подходом является использование Array.new()
вместо .times.map
. Rubocop рекомендует.
Пример:
string_size = 9
Array.new(string_size) do
rand(10).to_s
end
Рубукоп, TimesMap:
https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Performance/TimesMap
Ответ 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')