Random과 SecureRandom의 차이점
-
SecureRandom: 운영체제의 엔트로피 소스를 활용하여 진정한 무작위 바이트를 읽어옵니다. 따라서 비결정적이며 재현 불가능합니다.
-
Random: 메르센 트위스터(Mersenne Twister) 알고리즘을 구현하며, 시드(seed)를 통해 예측 가능한 의사 난수 시퀀스를 생성합니다. 이는 비트 혼합 기술을 통해 달성됩니다.
Random의 상태 관리 및 성능
-
Random객체는 시드를 기반으로 내부 상태를 가지며, 이 상태는 난수 요청 시 비가역적으로 변경됩니다. 생성된 엔트로피의 양에 따라 다음 값이 달라질 수 있습니다. -
Random은SecureRandom보다 훨씬 빠릅니다. 예를 들어,uuid10,000개를 생성할 때Random객체를 미리 시딩하여 사용하면SecureRandom보다 2.5배 이상 빠른 성능을 보입니다.securerandom라이브러리를 require하면Random에도uuid,hex,base64등의 호환 메서드가 추가되어 결정론적 동작을 유지하면서SecureRandom과 유사하게 사용할 수 있습니다.
Random의 주요 활용 사례
- 예측 가능한 테스트: `Array
sample, Array
shuffle과 같은 메서드에 random: Random.new(seed)를 전달하여 테스트 실행 순서나 데이터 샘플링을 결정론적으로 만듭니다. Minitest.seed 또는 RSpec.configuration.seed`를 활용하면 실패한 테스트를 100% 재현할 수 있습니다.
-
가상 데이터 생성:
Random.new(Minitest.seed)를 사용하여 파일 키, 바이너리 데이터, SHA2 체크섬 등을 결정론적으로 생성하여 ActiveStorage와 같은 시스템 테스트에 활용할 수 있습니다. -
기능 플래그: 사용자 ID를 시드로 사용하여
rng.rand <= 0.2와 같이 특정 사용자에게 기능이 노출될지 여부를 결정론적으로 판단할 수 있습니다. -
Faker와의 연동:
Faker::Config.random에Random인스턴스를 할당하여 가상 사용자, 계정, 거래 내역 등 복잡한 데이터 그래프를 시드를 통해 재현 가능하게 생성할 수 있습니다. 단, 각 Faker 호출마다 새로운Random.new(seed)를 할당해야 완전히 독립적인 결정론적 출력을 보장할 수 있습니다. -
분포 시뮬레이션: 평균값과 P90(90번째 백분위수) 값을 기반으로
Inverse transform sampling과 같은 통계 기법을 적용하여 백그라운드 작업 시간 분포와 같은 현실적인 데이터를 시뮬레이션하고 성능 테스트에 활용할 수 있습니다.