Skip to main content

seedfaker_core/gen/
integer.rs

1use std::fmt::Write;
2
3use crate::ctx::GenContext;
4
5/// Tiered distribution for realistic integer values without explicit range.
6/// Biased toward small numbers — matches real-world ID sequences, counts, quantities.
7///
8/// | Range       | Probability | Use case              |
9/// |-------------|-------------|-----------------------|
10/// | 1-100       | 30%         | counts, quantities    |
11/// | 100-1000    | 25%         | IDs, scores           |
12/// | 1K-10K      | 20%         | employee IDs, codes   |
13/// | 10K-100K    | 15%         | order numbers         |
14/// | 100K-999K   | 10%         | large sequence IDs    |
15fn tiered_integer(rng: &mut crate::rng::Rng) -> i64 {
16    let w = rng.urange(0, 99);
17    match w {
18        0..=29 => rng.range(1, 100),
19        30..=54 => rng.range(100, 1000),
20        55..=74 => rng.range(1000, 10_000),
21        75..=89 => rng.range(10_000, 100_000),
22        _ => rng.range(100_000, 999_999),
23    }
24}
25
26pub fn raw(ctx: &mut GenContext<'_>) -> f64 {
27    let value =
28        if matches!(ctx.ordering, crate::field::Ordering::Asc | crate::field::Ordering::Desc) {
29            let (min, max) = ctx.range.unwrap_or((1, 999_999));
30            let tag = super::helpers::handle::unique_tag(ctx.rng.record(), 0x1147);
31            super::helpers::monotonic::monotonic_value(
32                ctx.rng.record(),
33                tag,
34                min,
35                max,
36                ctx.ordering,
37            )
38        } else if let Some((min, max)) = ctx.range {
39            if let Some(z) = ctx.zipf {
40                ctx.rng.zipf_range(min, max, z.s)
41            } else {
42                ctx.rng.range(min, max)
43            }
44        } else {
45            tiered_integer(&mut ctx.rng)
46        };
47    value as f64
48}
49
50pub fn fmt(v: f64, _ctx: &mut GenContext<'_>, buf: &mut String) {
51    let _ = write!(buf, "{}", v as i64);
52}
53
54pub fn gen(ctx: &mut GenContext<'_>, buf: &mut String) {
55    let v = raw(ctx);
56    ctx.numeric = Some(v);
57    fmt(v, ctx, buf);
58}