Вопрос:

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

ruby random

36605 просмотра

18 ответа

3489 Репутация автора

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

Автор: quackingduck Источник Размещён: 29.08.2008 04:08

Ответы (18)


79 плюса

3489 Репутация автора

Чтобы сгенерировать числовой вызов rand с результатом выражения «10 на мощность 10»,

rand(10 ** 10)

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

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

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

rand(10 ** 10).to_s.rjust(10,'0')  
Автор: quackingduck Размещён: 29.08.2008 04:13

2 плюса

3625 Репутация автора

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

'%011d' % rand(1e10)

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

'%011d' % rand(10_000_000_000) # Note that underscores are ignored in integer literals
Автор: Grant Hutchins Размещён: 06.10.2008 06:52

3 плюса

82 Репутация автора

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

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

конец

Автор: Poseidon_Geek Размещён: 11.07.2012 11:22

0 плюса

15739 Репутация автора

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

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

Автор: Paulo Fidalgo Размещён: 24.01.2013 12:18

50 плюса

1681 Репутация автора

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

rand.to_s[2..11] 
 => "5950281724"
Автор: Kreeki Размещён: 10.08.2013 11:12

7 плюса

735 Репутация автора

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

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

Синтаксис ответа @ quackingduck был бы

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

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

Характер этого предпочтения в первую очередь объясняется загадочным характером %. Это не очень семантично само по себе, и без какого-либо дополнительного контекста его можно спутать с %оператором modulo.

Примеры из руководства по стилю :

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

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

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

Автор: Gabriel Osorio Размещён: 13.09.2013 03:02

1 плюс

1423 Репутация автора

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, чтобы подтвердить это.

Автор: Tan Размещён: 05.09.2014 09:42

6 плюса

9385 Репутация автора

НЕ ИСПОЛЬЗУЙТЕ 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диапазоном.

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

Автор: Kamil Lelonek Размещён: 26.05.2015 11:00

1 плюс

31 Репутация автора

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

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

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

Автор: Dharani Manne Размещён: 24.06.2015 08:10

2 плюса

206719 Репутация автора

Этот метод работает для любого «алфавита»,

(1..10).map{"0123456789".chars.to_a.sample}.join
=> "6383411680"
Автор: John La Rooy Размещён: 25.06.2015 07:19

13 плюса

1259 Репутация автора

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

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

Эта to_iчасть нужна, потому что 1e9и 1e10на самом деле плавает:

irb(main)> 1e9.class
=> Float
Автор: art-solopov Размещён: 25.06.2015 07:24

23 плюса

61341 Репутация автора

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

10.times.map{rand(10)}.join # => "3401487670"
Автор: steenslag Размещён: 03.03.2016 11:23

2 плюса

733 Репутация автора

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

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

генерировать 10-значный номер номера -

Random.new.rand((10**(10 - 1))..(10**10))
Автор: Rahul Patel Размещён: 12.10.2016 09:46

7 плюса

578 Репутация автора

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

Использовать метод 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 можно найти здесь .

Автор: 907th Размещён: 11.04.2017 01:06

1 плюс

14960 Репутация автора

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

require 'regexp-examples'

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

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

Автор: Tom Lord Размещён: 02.08.2017 10:48

0 плюса

406 Репутация автора

Лучше использовать 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

Автор: Anderson Marques Размещён: 21.06.2018 10:52

0 плюса

3947 Репутация автора

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

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

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

(1..1000).each { puts rand(10 ** 9...10 ** 10) }
Автор: Lalit Kumar Размещён: 29.08.2018 10:39

0 плюса

11 Репутация автора

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

require 'string_pattern'
puts "10:N".gen
Автор: user2546667 Размещён: 06.12.2018 03:25
Вопросы из категории :
32x32