program tip

루비에서 임의의 10 자리 숫자를 생성하려면 어떻게해야합니까?

radiobox 2020. 11. 29. 10:12
반응형

루비에서 임의의 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)

한 가지주의 사항 1e10Float이며 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

반응형