Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby에서 난수와 랜덤 문자열을 생성하는 방법 완벽 가이드

Ruby에서 난수와 랜덤 문자열을 생성하는 방법을 배우고 싶으시다면, 잘 찾아오셨습니다.

이 글이 바로 그 주제를 다루고 있기 때문입니다!

난수를 활용하면 배열에서 임의의 요소를 선택하거나, 목록에서 당첨자를 뽑거나, 주사위 굴리기를 구현하는 등 다양한 작업을 할 수 있습니다.

Ruby에는 여러 특성을 가진 난수를 생성하는 다양한 방법이 존재합니다.

예를 들어…

rand 메서드는 세 가지 방식으로 사용할 수 있습니다:

  • 인자 없이 호출하면 0과 1 사이의 부동소수점 숫자를 반환합니다 (예: 0.4836732493)
  • 정수 인자를 전달하면 (rand(10)) 0부터 해당 숫자 미만 사이의 정수를 반환합니다
  • 범위(range) 인자를 전달하면 (rand(1..20)) 범위의 시작값과 끝값 사이의 정수를 반환합니다

Ruby에서 무작위성을 만들어내는 다른 방법들도 있습니다:

  • Array#shuffle 메서드
  • Array#sample 메서드
  • SecureRandom 클래스

지금부터 예제와 함께 하나씩 살펴보겠습니다!

난수 생성하기

rand 메서드를 사용하면 Ruby에서 손쉽게 난수를 만들 수 있습니다:

인자 없이 호출하면 rand는 부동소수점 숫자(0.4836732493)를 생성합니다.

인자를 전달하면 0부터 해당 숫자 미만(포함되지 않음)까지의 숫자를 생성합니다.

rand 100
> 41

Ruby에서 난수 생성은 정말 간단합니다. 하지만 0이 아닌 특정 범위 내의 숫자가 필요하다면 어떻게 해야 할까요?

걱정하지 마세요!

범위(range)를 사용하면 원하는 값을 정확히 얻을 수 있습니다.

예제:

rand 200..500
> 352

보안이 강화된 난수 생성하기

rand가 생성하는 숫자만으로도 간단한 애플리케이션에는 충분할 수 있습니다…

…하지만 비밀번호 재설정 토큰 생성처럼 보안 목적으로 난수를 사용해야 한다면, Ruby 표준 라이브러리에 포함된 SecureRandom을 사용해야 합니다.

SecureRandom은 Unix 시스템에서는 /dev/urandom을, Windows에서는 CryptAcquireContext / CryptGenRandom API를 시드(seed)로 사용합니다.

예제를 살펴보겠습니다:

require 'securerandom'

SecureRandom.random_number
> 0.232

보시다시피 rand와 매우 유사하게 동작하며, 최댓값 역시 지정할 수 있습니다.

예제:

SecureRandom.random_number(100)
> 72

SecureRandom은 그 외에도 다양한 출력 형식을 제공합니다.

hex를 사용하면 고정 폭의 16진수 문자열을 생성할 수 있습니다.

SecureRandom.hex
> "87694e9e5231abca6de39c58cdfbe307"

Ruby 2.5에서는 영숫자(alphanumeric)로 이루어진 랜덤 문자열을 생성하는 새로운 메서드가 도입되었습니다:

SecureRandom.alphanumeric
> "PSNVXOeDpnFikJPC"

배열에서 임의의 요소 뽑기

이번에는:

목록에서 임의의 항목을 하나 뽑고 싶은 경우입니다.

다음과 같이 시도해 볼 수 있습니다:

[5, 15, 30, 60].shuffle.first
> 30

하지만 Ruby에는 이 작업에 더 적합하고(그리고 더 빠른) sample 메서드가 있습니다:

[5, 15, 30, 60].sample
> 5

sample은 범위에도 사용할 수 있으며, 아래 코드는 알파벳 소문자 중 하나를 무작위로 뽑습니다:

('a'..'z').to_a.sample
> b

정수 인자를 전달하면 배열에서 N개의 중복 없는 고유 요소를 얻을 수 있습니다:

[1,2,3].sample(2)
> [1, 2]

또한 커스텀 랜덤 제너레이터를 인자로 전달하는 것도 가능합니다:

[1,2,3].sample(random: SecureRandom)

Ruby로 랜덤 문자열 만들기

무작위성의 궁극적인 활용 사례는 원하는 문자 집합으로 랜덤 문자열을 생성하는 것입니다. 코드는 다음과 같습니다:

def generate_code(number)
  charset = Array('A'..'Z') + Array('a'..'z')
  Array.new(number) { charset.sample }.join
end

puts generate_code(20)

여기서 몇 가지 일이 일어나고 있습니다.

먼저, 범위를 배열로 변환하여 문자 집합(charset)을 준비합니다. 그다음 블록과 함께 Array.new를 호출하는 기능을 활용하는데, 이를 통해 블록이 생성하는 값들로 크기 n의 배열을 초기화할 수 있습니다.

이 코드는 TufwGfXZskHlPcYrLNKg와 같은 형태의 문자열을 생성합니다.

필요에 맞게 문자 집합을 자유롭게 조정할 수 있습니다.

랜덤 제너레이터 시드(Seed) 설정하기

rand 같은 메서드가 어떤 숫자를 생성할지 직접 제어하고 싶다면 시드(seed)를 설정하면 됩니다.

시드란 무엇일까요?

시드는 난수 시퀀스를 시작하는 숫자입니다.

생성된 모든 숫자는 이 시드로부터 파생됩니다.

그렇기 때문에 좋은 난수 시퀀스를 만들려면 시드의 품질이 핵심이 되곤 합니다.

Ruby는 이미 이를 자동으로 처리해 주지만(추가적인 보안이 필요하다면 SecureRandom을 사용하세요), 테스트나 디버깅 같은 일부 상황에서는 시드를 직접 설정하고 싶을 수 있습니다.

이럴 때 srand 메서드를 사용하면 됩니다.

다음과 같이 말이죠:

Kernel.srand(1)

이렇게 시드를 설정하면 제너레이터가 어떤 숫자를 반환할지 정확히 예측할 수 있습니다.

시드를 1로 설정했을 때의 결과:

Array.new(5) { rand(1..10) }
# [6, 9, 10, 6, 1]

시드를 다시 1로 설정하면 시퀀스는 6, 9, 10 순서로 동일하게 시작됩니다.

마무리

이것으로 끝입니다! 이제 Ruby 프로그램에서 무작위성을 자유롭게 활용할 준비가 되었습니다 🙂

이 글이 도움이 되었나요?

친구들에게 공유하고, 새로운 소식을 놓치지 않도록 뉴스레터를 구독해 보세요!