Abseil Random Distributions — Uniform·Exponential
#분포 API의 형태
Abseil 분포는 모두 자유 함수 다. URBG를 첫 인자로, 분포 파라미터를 그 뒤로.
absl::BitGen bg;
int u = absl::Uniform(bg, 0, 10);double g = absl::Gaussian<double>(bg, 0.0, 1.0);double e = absl::Exponential<double>(bg, 1.0);int p = absl::Poisson<int>(bg, 5.0);bool b = absl::Bernoulli(bg, 0.5);double z = absl::Zipf<double>(bg, 100, 2.0);double lr = absl::LogUniform<double>(bg, 1, 1000);std::uniform_int_distribution처럼 분포 객체를 미리 만들 필요가 없다. 매 호출이 stateless다(파라미터는 매번 전달).
#Uniform — 가장 자주 쓰는
Uniform은 정수·실수 모두 지원한다. 두 형태가 있다.
// 기본 — [a, b) (정수·실수 동일)int i = absl::Uniform(bg, 0, 100);
// interval tag 명시int j = absl::Uniform(absl::IntervalClosed, bg, 1, 6); // [1, 6]int k = absl::Uniform(absl::IntervalOpen, bg, 0, 10); // (0, 10)int l = absl::Uniform(absl::IntervalOpenClosed, bg, 0, 9); // (0, 9]
// 단일 인자 — [0, n) 정수int n = absl::Uniform(bg, 100);타입 추론은 인자에서. 명시도 가능.
auto x = absl::Uniform(bg, 0, 10); // intauto y = absl::Uniform(bg, 0.0, 1.0); // doubleauto z = absl::Uniform<int64_t>(bg, 0, 1'000'000); // 명시 타입#Gaussian / Normal
정규 분포. 평균 μ와 표준편차 σ.
double standard = absl::Gaussian<double>(bg, 0.0, 1.0);double iq = absl::Gaussian<double>(bg, 100.0, 15.0);absl::Gaussian은 별칭(STL 호환)이고 정식 이름은 같은 함수다. std::normal_distribution과 동일한 통계.
#Exponential
지수 분포. 인자 lambda(rate).
// 평균 = 1/lambdadouble dt = absl::Exponential<double>(bg, 0.5); // 평균 2.0도착 간격(Poisson process의 inter-arrival) 시뮬레이션에 자주 쓴다.
#Poisson
이산 Poisson 분포. 인자 mean.
int requests = absl::Poisson<int>(bg, 100.0); // 평균 100건/유닛부하 시뮬레이션이나 큐 도착 모델링.
#Bernoulli — 동전 던지기
bool heads = absl::Bernoulli(bg, 0.5); // 50%bool rare = absl::Bernoulli(bg, 0.01); // 1% 확률A/B 테스트, 샘플링 게이트에 깔끔.
// 1% 샘플링 로깅if (absl::Bernoulli(bg, 0.01)) { LOG(INFO) << expensive_dump;}#Zipf — 멱법칙
웹 트래픽, 단어 빈도, 캐시 키 분포에 자주 등장.
// k ∈ [1, n], 가중치 ∝ 1 / k^sint k = absl::Zipf<int>(bg, 1000, 1.0); // 캐시 키 핫스팟 모방#LogUniform — 로그 균등
자릿수가 균등하게 나오는 분포.
// [1, 1000] 범위에서 자릿수 균등 (1자리, 2자리, 3자리가 같은 확률)int latency = absl::LogUniform<int>(bg, 1, 1000);응답 시간 분포 모델링이나 perf 테스트의 다양한 사이즈 생성에 적합.
#Beta
double q = absl::Beta<double>(bg, alpha, beta);베이지안 추정의 사전 분포에 흔히 등장. 알파/베타가 모두 1이면 균등 분포와 같다.
#분포 카탈로그 요약
| 분포 | 함수 | 파라미터 | 용도 |
|---|---|---|---|
| Uniform | Uniform | (lo, hi) | 일반 random |
| Gaussian | Gaussian | (μ, σ) | 정규 분포 |
| Exponential | Exponential | (λ) | 도착 간격 |
| Poisson | Poisson | (mean) | 카운트 |
| Bernoulli | Bernoulli | (p) | 동전, 샘플링 |
| Zipf | Zipf | (n, s) | 멱법칙, 핫스팟 |
| LogUniform | LogUniform | (lo, hi) | 자릿수 균등 |
| Beta | Beta | (α, β) | 베이지안 prior |
std::*_distribution은 거의 1
std::geometric_distribution만 Abseil에 직접 대응 없음 — 필요하면 1 + Exponential / -log(1-p)로 합성).
#작은 예시 — 부하 생성기
struct Request { absl::Time arrival; int size_bytes; int latency_budget_ms;};
std::vector<Request> GenerateLoad(absl::BitGen& bg, absl::Duration window, double qps_mean) { std::vector<Request> out; absl::Time t = absl::Now(); absl::Time end = t + window;
while (t < end) { Request r; r.arrival = t; r.size_bytes = absl::LogUniform<int>(bg, 64, 1 << 20); r.latency_budget_ms = absl::Gaussian<int>(bg, 100, 30); out.push_back(r);
// 다음 도착까지 Exponential 간격 double dt = absl::Exponential<double>(bg, qps_mean); t += absl::Microseconds(static_cast<int64_t>(dt * 1e6)); } return out;}stateless 함수 호출 덕분에 한 BitGen으로 여러 분포가 자연스럽게 섞인다.
#회피 패턴
// 회피 — std 분포 객체를 매번 생성for (int i = 0; i < n; ++i) { std::normal_distribution<> dist(0, 1); // ❌ 매번 객체 생성 out[i] = dist(gen);}
// Good — absl은 statelessfor (int i = 0; i < n; ++i) { out[i] = absl::Gaussian<double>(bg, 0, 1);}// 회피 — 잘못된 interval 가정int dice = absl::Uniform(bg, 1, 6); // ❌ 1..5만 나옴
// Goodint dice = absl::Uniform(absl::IntervalClosed, bg, 1, 6);#정리
- 모든 분포가 자유 함수. URBG 첫 인자 + 파라미터.
- Stateless — 분포 객체를 들고 다닐 필요 없음.
Uniform은 정수·실수 모두[a, b)기본. interval tag로 명시 변경.- Gaussian/Exponential/Poisson/Bernoulli/Zipf/LogUniform/Beta가 표준 카탈로그.
- 같은 BitGen으로 여러 분포를 자유롭게 섞어 호출.
#다음 장 예고
Part 8-03: Mocking random — 결정적 테스트를 위한 MockingBitGen.
#관련 항목
Abseil Code Review · 46 of 79
- 1 Abseil Code Review — Google production-grade C++ 라이브러리 분석
- 2 Abseil 개요 — Google이 std를 보완한 이유
- 3 Abseil 설계 철학 — std 호환과 추가 기능의 균형
- 4 Abseil 빌드와 의존성 — Bazel vs CMake
- 5 Abseil LTS vs HEAD 릴리스 모델 분석
- 6 Abseil Versioning과 ABI 호환성 정책
- 7 Abseil 매크로 — ABSL_HAVE_*·ABSL_ATTRIBUTE_*
- 8 Abseil ABSL_PREDICT_TRUE/FALSE — branch hint
- 9 absl::LogSeverity — 로그 레벨 타입
- 10 Abseil type_traits — negation·conjunction·void_t
- 11 Abseil Conformance·Policy 분석
- 12 Abseil Memory utilities 분석
- 13 Abseil raw_logging — heap-free 로깅
- 14 Abseil thread_annotations — clang TSA 통합
- 15 absl::Status — exception-free error handling
- 16 absl::StatusOr<T> — 값 또는 에러
- 17 absl status_macros — ASSIGN_OR_RETURN·RETURN_IF_ERROR
- 18 absl::Status payload — 구조화된 에러 컨텍스트
- 19 absl::Status ↔ exception 변환 패턴
- 20 absl::string_view — non-owning 문자열 참조
- 21 absl::string_view 함정 — dangling·c_str·임시 객체
- 22 absl::StrCat — 가변 인자 문자열 연결과 AlphaNum
- 23 absl::StrSplit — Delimiter·Predicate·컨테이너 변환
- 24 absl::StrJoin — 컨테이너 결합과 Formatter
- 25 absl::StrFormat — type-safe printf·FormatSpec
- 26 Abseil ASCII 함수 — locale-free 분류·대소문자 변환
- 27 Abseil Escape — CEscape·HexEscape·Base64
- 28 absl::flat_hash_map — Swiss Table 기반 hash map
- 29 absl::flat_hash_set — set 버전 Swiss Table
- 30 absl::node_hash_map — stable pointer가 필요할 때
- 31 absl::btree_map — sorted·cache-friendly B-tree
- 32 absl::FixedArray — 런타임 크기 stack 배열
- 33 absl::InlinedVector — small buffer optimization
- 34 Abseil Swiss Table internals — control byte·SIMD probing
- 35 absl::Mutex — reader-writer·fairness·deadlock 검출
- 36 absl::Mutex Conditional Critical Section — Await로 cv 없애기
- 37 absl::Notification — once-only signal
- 38 absl::BlockingCounter·Barrier — 다중 thread 조율
- 39 absl::Mutex annotations — clang thread-safety로 race를 컴파일 타임에
- 40 absl::Time·Duration 분석 — 단단한 type
- 41 absl::Time Format·Parse
- 42 absl::CivilTime 분석
- 43 absl::time_zone 분석
- 44 absl::Time mocking — 테스트 친화 시간
- 45 absl::BitGen — 모던 난수 생성기
- 46 Abseil Random Distributions — Uniform·Exponential
- 47 Abseil Mocking Random — 테스트 결정성
- 48 Abseil Random Seeding·Entropy
- 49 absl::int128·uint128 분석
- 50 absl::bits — popcount·countl_zero
- 51 absl::optional vs std::optional
- 52 absl::variant 분석
- 53 absl::span 분석
- 54 absl::any 분석
- 55 absl::compare — three-way 비교
- 56 Abseil utility — apply·in_place
- 57 Abseil AbslHashValue 분석
- 58 Abseil HashState chaining
- 59 Abseil Custom hashable 구현
- 60 Abseil LOG·VLOG·CHECK 분석
- 61 Abseil LogSink 분석
- 62 Abseil LogEntry·structured logging
- 63 Abseil Stack trace·failure_signal_handler
- 64 ABSL_FLAG 정의 분석
- 65 Abseil ParseCommandLine 동작
- 66 Abseil Flag introspection·validation
- 67 Google 스타일의 Abseil 사용 패턴
- 68 Abseil 자주 보는 anti-pattern
- 69 std → absl 마이그레이션 전략
- 70 absl::Cleanup — 함수 종료 시 실행 보장
- 71 Abseil algorithm container 확장 — c_sort·c_find_if·c_count_if
- 72 absl::function_ref와 any_invocable — 함수 객체 전달의 두 축
- 73 absl::bind_front와 Overload — 함수 객체 보조 도구
- 74 absl::Cord — 분산 시스템용 대용량 문자열
- 75 absl::from_chars·SimpleAtoi — 빠른 숫자 변환
- 76 absl::Cord vs std::string — 선택 기준과 메모리 프로파일
- 77 absl::GetStackTrace와 Symbolize — crash 시 readable stack
- 78 absl::ComputeCrc32c — 하드웨어 가속 체크섬
- 79 absl::PeriodicSampler — 적응형 샘플링·jitter 회피
관련 글
Abseil Random Seeding·Entropy
BitGen 시드 관리 — OS entropy, SeedSeq, 결정적 재현성. 그리고 보안 한계.
같은 시리즈에서 이어 읽기
Abseil Mocking Random — 테스트 결정성
MockingBitGen — 분포 호출의 결과값을 결정적으로 강제. flaky random 테스트를 끝낸다.
같은 시리즈에서 이어 읽기
absl::BitGen — 모던 난수 생성기
absl::BitGen — std::mt19937 + std::uniform_int_distribution의 길고 verbose한 조합을 단일 호출로 압축한 random engine.
같은 시리즈에서 이어 읽기