루비에서 임의의 10 자리 숫자를 생성하려면 어떻게해야합니까?
또한 0으로 채워진 문자열로 형식을 지정할 수 있습니까?
숫자를 생성하려면 "10에서 10의 거듭 제곱"이라는 식의 결과로 rand를 호출합니다.
rand(10 ** 10)
숫자를 0으로 채우려면 문자열 형식 연산자를 사용할 수 있습니다.
'%010d' % rand(10 ** 10)
또는 rjust
문자열 의 방법
rand(10 ** 10).to_s.rjust(10,'0')
나는 아마도 내가 아는 가장 간단한 해결책을 제공하고 싶습니다. 이것은 꽤 좋은 속임수입니다.
rand.to_s[2..11]
=> "5950281724"
이것은 10 크기의 숫자 문자열을 생성하는 빠른 방법입니다.
10.times.map{rand(10)}.join # => "3401487670"
가장 간단한 대답은 아마도
rand(1e9...1e10).to_i
to_i
부분이 있기 때문에 필요 1e9
하고 1e10
실제로 수레 있습니다 :
irb(main)> 1e9.class
=> Float
사용하지 마십시오 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
범위 내에서 무언가를 반환 합니다.
나는 좋은 테스트를 받았다는 것이 기쁘고 당신이 당신의 시스템을 망가 뜨리지 않기를 바랍니다.
이 언급되지 않은 그냥 때문에 Kernel#sprintf
방법 (또는 그것의 별칭 Kernel#format
의 파워팩 라이브러리 ) 일반적으로 선호되는 String#%
에서 언급 한 바와 같이, 방법 루비 커뮤니티 스타일 가이드 .
물론 이것은 매우 논쟁의 여지가 있지만 통찰력을 제공하기 위해 다음과 같습니다.
@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')
.
이것은 단지 커뮤니티의 경향을 보여줍니다. "최고"는 당신에게 달려 있습니다.
이 블로그 게시물에 더 많은 정보가 있습니다.
난수 생성
사용 커널 # 랜드의 방법 :
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!)
패딩을 사용하여 숫자를 문자열로 변환
사용 문자열 # %의의 방법 :
"%010d" % 123348 # => "0000123348"
암호 생성
KeePass 비밀번호 생성기 라이브러리를 사용하면 임의 비밀번호 생성을위한 다양한 패턴을 지원합니다.
KeePass::Password.generate("d{10}") # => random 10-digit string (may start with 0!)
KeePass 패턴에 대한 문서는 여기 에서 찾을 수 있습니다 .
첫 번째 답변을 수정하고 싶습니다. rand (10**10)
0이 첫 번째 자리에 있으면 9 자리 임의 번호를 생성 할 수 있습니다. 정확한 10 자리를 확인하려면 수정 만하면됩니다.
code = rand(10**10)
while code.to_s.length != 10
code = rand(11**11)
종료
n 자리 난수를 생성하는 가장 간단한 방법-
Random.new.rand((10**(n - 1))..(10**n))
10 자리 숫자 번호 생성-
Random.new.rand((10**(10 - 1))..(10**10))
다음은 quackingduck의 예보다 메서드 호출을 하나 더 적게 사용하는 표현식입니다.
'%011d' % rand(1e10)
한 가지주의 사항 1e10
은 Float
이며 Kernel#rand
결국이를 호출 to_i
하므로 더 높은 값의 경우 일부 불일치가있을 수 있습니다. 리터럴로 더 정확하게하려면 다음을 수행 할 수도 있습니다.
'%011d' % rand(10_000_000_000) # Note that underscores are ignored in integer literals
SecureRandom 루비 라이브러리를 사용해보십시오.
난수를 생성하지만 길이는 구체적이지 않습니다.
자세한 정보는이 링크를 통해 확인하십시오 : http://ruby-doc.org/stdlib-2.1.2/libdoc/securerandom/rdoc/SecureRandom.html
이 기술은 모든 "알파벳"에 적용됩니다.
(1..10).map{"0123456789".chars.to_a.sample}.join
=> "6383411680"
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 콘솔에서 확인합니다.
regexp-examples
루비 보석을 사용하는 다른 대답 :
require 'regexp-examples'
/\d{10}/.random_example # => "0826423747"
이 접근 방식으로 "0으로 채울"필요가 없습니다 String
..
아래에서 간단하게 사용하십시오.
rand(10 ** 9...10 ** 10)
아래에서 IRB에서 테스트하십시오.
(1..1000).each { puts rand(10 ** 9...10 ** 10) }
('%010d' % rand(0..9999999999)).to_s
또는
"#{'%010d' % rand(0..9999999999)}"
이것은 루비 1.8.7에서도 작동합니다.
rand (9999999999) .to_s.center (10, rand (9) .to_s) .to_i
더 나은 방법은 사용하는 것입니다 Array.new()
대신 .times.map
. Rubocop이 권장합니다.
예:
string_size = 9
Array.new(string_size) do
rand(10).to_s
end
루 부캅, 타임즈 맵 :
https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Performance/TimesMap
In my case number must be unique in my models, so I added checking block.
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)
To generate a random, 10-digit string:
# 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')
Here's more detail of what's happening, shown by breaking the single line into multiple lines with explaining variables:
# 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')
Random 10 numbers:
require 'string_pattern'
puts "10:N".gen
참고URL : https://stackoverflow.com/questions/34565/how-do-i-generate-a-random-10-digit-number-in-ruby
'program tip' 카테고리의 다른 글
Android 앱의 경우 SQLITE 데이터베이스를 내림차순으로 정렬하려면 어떻게해야합니까? (0) | 2020.11.29 |
---|---|
Linux의 JAVA_HOME 디렉토리 (0) | 2020.11.29 |
Twitter 애플리케이션 용 Android Intent (0) | 2020.11.29 |
C # 목록에서 중복 확인 (0) | 2020.11.29 |
정규식 : 목록에서 검색 (0) | 2020.11.29 |