seqtkrs 0.1.1

A Rust reimplementation of seqtk, a fast and lightweight tool for processing biological sequences in FASTA/FASTQ format
Documentation
// 随机数生成器模块
// 使用Mersenne Twister算法以保持与seqtk的可重现性

use rand_mt::Mt64;

/// Mersenne Twister随机数生成器包装
pub struct RandomGenerator {
    rng: Mt64,
}

impl RandomGenerator {
    /// 创建带种子的随机数生成器
    pub fn with_seed(seed: u64) -> Self {
        Self {
            rng: Mt64::new(seed),
        }
    }

    /// 创建使用当前时间作为种子的随机数生成器
    pub fn new() -> Self {
        let seed = std::time::SystemTime::now()
            .duration_since(std::time::UNIX_EPOCH)
            .unwrap()
            .as_secs();
        Self::with_seed(seed)
    }

    /// 生成[0, 1)之间的随机浮点数
    pub fn random(&mut self) -> f64 {
        use rand::Rng;
        self.rng.random()
    }

    /// 生成[0, n)之间的随机整数
    pub fn random_range(&mut self, n: u64) -> u64 {
        use rand::Rng;
        self.rng.random_range(0..n)
    }
}

impl Default for RandomGenerator {
    fn default() -> Self {
        Self::new()
    }
}

/// Mersenne Twister随机数生成器的别名
pub type MersenneTwister = RandomGenerator;

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_random_with_seed() {
        let mut rng1 = RandomGenerator::with_seed(12345);
        let mut rng2 = RandomGenerator::with_seed(12345);

        // 相同种子应该产生相同的随机数序列
        for _ in 0..10 {
            assert_eq!(rng1.random(), rng2.random());
        }
    }

    #[test]
    fn test_random_range() {
        let mut rng = RandomGenerator::with_seed(12345);

        // 测试生成的随机数在范围内
        for _ in 0..100 {
            let r = rng.random_range(10);
            assert!(r < 10);
        }
    }

    #[test]
    fn test_random_in_range() {
        let mut rng = RandomGenerator::with_seed(12345);

        // 测试random()生成的值在[0, 1)范围内
        for _ in 0..100 {
            let r = rng.random();
            assert!(r >= 0.0 && r < 1.0);
        }
    }

    #[test]
    fn test_different_seeds() {
        let mut rng1 = RandomGenerator::with_seed(12345);
        let mut rng2 = RandomGenerator::with_seed(54321);

        // 不同种子应该产生不同的随机数
        let mut different = false;
        for _ in 0..10 {
            if rng1.random() != rng2.random() {
                different = true;
                break;
            }
        }
        assert!(different);
    }

    #[test]
    fn test_default() {
        let _rng = RandomGenerator::default();
        // 只要能创建就好,不测试具体值
    }
}