c++ 随机数

在 C++ 中生成随机数通常需要使用随机数生成器。C++11 引入了 <random> 头文件,其中包含了用于生成随机数的类和函数。

1.  随机选择一个数

#include <iostream>
#include <random>

int main() {
    // 创建一个 random_device 对象用于生成随机种子
    std::random_device rd;

    // 使用随机种子初始化一个默认随机数引擎
    std::mt19937 gen(rd());

    // 创建一个均匀分布的随机数分布器,范围是 [1, 100]
    std::uniform_int_distribution<int> dis(1, 100);

    // 生成随机数
    int random_num = dis(gen);

    // 输出随机数
    std::cout << "Random number: " << random_num << std::endl;

    return 0;
}

2. 从string序列中随机选择一个元素

#include <iostream>
#include <string>
#include <random>

// 函数:从字符串中随机选择一个字符
char randomSelectChar(const std::string& str) {
    // 获取字符串的长度
    size_t len = str.length();

    // 生成一个随机的索引值
    std::random_device rd;
    
    /*
     std::mt19937 是 C++ 标准库中的一个伪随机数生成器(PRNG),它基于梅森旋转算法实现。这个生成器在 C++11 中被引入,提供了高质量的随机数序列。
     */
    
    std::mt19937 gen(rd());
    std::uniform_int_distribution<size_t> dis(0, len - 1);
    size_t index = dis(gen);
    
    std::cout << "index: " << index << std::endl;

    // 返回随机选择的字符
    return str[index];
}

int main() {
    // 示例用法
    std::string dna_seq = "AGCTGCGTCACCGTACGCTA";

    // 调用函数从字符串中随机选择一个字符
    char randomChar = randomSelectChar(dna_seq);

    // 输出随机选择的字符
    std::cout << "Randomly selected character: " << randomChar << std::endl;

    return 0;
}

3. 随机突变DNA序列中碱基

#include <iostream>
#include <string>
#include <random>
#include <vector>


int main() {
    // 示例用法
    std::string dna_seq = "AGCTGCGTCACCGTACGCTAA";
    // index向量
    size_t dna_len = dna_seq.size();
    
    std::vector<size_t> seq_index;
    for (size_t index = 0; index < dna_len; ++index) {
        seq_index.push_back(index);
    }
    
    // 使用 std::random_device 获取随机数种子
    std::random_device rd;
    // 使用随机数种子创建默认的伪随机数引擎
    std::default_random_engine rng(rd());
    
    // 打乱seq_index中的元素
    std::shuffle(seq_index.begin(), seq_index.end(), rng);
    
    // 选择前n个元素,保证突变碱基数不超过最大允许值
    double mut_ratio = 0.2;
    size_t mut_num = dna_len * mut_ratio;
    
    std::cout << "mutated base num: " << mut_num << std::endl;
    
    seq_index.resize(mut_num);
    
    std::cout << "original sequence: " << dna_seq << std::endl;
    // 突变序列,不改变GC含量
    for (auto index : seq_index){
        if (dna_seq[index] == 'A')
            dna_seq[index] = 'T';
        else if (dna_seq[index] == 'T')
            dna_seq[index] = 'A';
        else if (dna_seq[index] == 'G')
            dna_seq[index] = 'C';
        else if (dna_seq[index] == 'C')
            dna_seq[index] = 'G';
    }
    std::cout << "mutated sequence: " << dna_seq << std::endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值