더 작고 일관된 난수 API를 위해 rand를 포크한 이유

1 day ago 7

Rust의 대표 난수 크레이트 rand는 일상적인 연산이 여러 특성에 흩어져 있어, 더 작은 공개·구현 표면과 일관된 사용 경험을 갖춘 urandom을 개발함 고수준 연산을 하나의 Random 구조체에 모으고 Rng 특성을 봉인해, 임의 생성기 지원보다 API 발견성과 내부 최적화를 우선함 새로운 난수 알고리듬을 도입하지 않고 Xoshiro256의 출력 함수를 용도별로 선택해, 1,000개 f64 생성 벤치마크에서 rand 0.10.2보다 약 31% 높은 처리량을 기록함 균등 정수 표본 추출은 임계값을 지연 계산하는 하나의 비편향 구현으로 재사용·일회성 경로를 통합했으며, 500..20_000 범위 벤치마크에서 rand의 두 경로보다 빨랐음 명시적 시드의 원시 출력은 지원 아키텍처와 SemVer 호환 릴리스에서 재현성을 보장하지만, 임의 생성기 연결과 rand의 방대한 분포·서드파티 통합 생태계는 포기함 하나로 모은 Random API rand의 유용한 연산은 여러 특성에 흩어져 있음 난수 범위 생성에는 RngExt, 시퀀스 선택에는 IndexedRandom, 섞기에는 SliceRandom이 필요함 rand 0.10은 일회성 호출을 위한 rand::random_range 같은 루트 수준 도우미를 제공함 RNG 핸들을 유지하거나 선택·섞기 같은 시퀀스 연산을 사용하려면 여전히 여러 특성의 메서드를 찾아야 함 prelude로 가져오기를 줄여도 확장 메서드가 RNG, 슬라이스, 반복자 중 어느 타입에 적용되는지 알아야 하므로 IDE 자동 완성만으로 찾기 어려움 urandom은 고수준 소비자 API를 하나의 Random 래퍼 구조체에 배치함 urandom::new()로 Random<urandom::rng::Xoshiro256Rng>를 생성함 uniform, choose, shuffle을 같은 객체에서 호출할 수 있음 자동 완성으로 random, uniform, chance, choose, shuffle, sample 등을 확인할 수 있음 모두 고유 메서드이므로 고수준 확장 특성을 찾거나 가져올 필요가 없음 확장성 대신 최적화를 택한 봉인된 Rng rand는 저수준 RNG 특성을 공개 확장 지점으로 취급하지만, urandom의 Rng 특성은 봉인되어 지원 생성기를 크레이트 내부에서 선택하고 구현함 임의 생성기를 Random에 연결할 수 없음 새 생성기를 추가하려면 urandom 자체를 변경해야 함 더 나은 알...

Read Entire Article