如何计算字符串中字母的概率

时间:2012-09-01 07:56:17

标签: c++ string probability

所以我正在研究(C ++)中的一个项目,我必须计算从文本文件中读取的DNA序列中核苷酸的概率。我已经找到了关于文件的其他信息,例如序列的平均长度,方差,偏差等。

...示例 "atgatatgagc"

我可以提供一个'a'弹出或't'的可能性......等等

任何提示或建议?

3 个答案:

答案 0 :(得分:4)

char letter='a';
string str="abcd"; 
cout << (double) std::count(str.begin(), str.end(), letter) / str.size();

答案 1 :(得分:2)

如果缺少更多信息,并假设每个字母的概率相等,则任何字母“弹出”的概率为1/4,假设有四个可能的字母ATGC

答案 2 :(得分:0)

Leonid Volnitsky代码的略微修改:

 #include <iostream>
#include <algorithm>
#include <string>
using namespace std ;



int main(void)
{

    char character_A='A';
    char character_C='C';
    char character_G='G';
    char character_T='T';

    string DNA_Sequence="ACAAGATGCCATTGTCCCCCGGCCTCCTGCTGCTGCTGCTCTCCGGGGCCACGGCCACCGCTGCCCTGCCCCTGGAGGGTGGCCCCACCGGCCGAGACAGCGAGCATATGCAGGAAGCGGCAGGAATAAGGAAAAGCAGCCTCCTGACTTTCCTCGCTTGGTGGTTTGAGTGGACCTCCCAGGCCAGTGCCGGGCCCCTCATAGGAGAGGAAGCTCGGGAGGTGGCCAGGCGGCAGGAAGGCGCACCCCCCCAGCAATCCGCGCGCCGGGACAGAATGCCCTGCAGGAACTTCTTCTGGAAGACCTTCTCCTCCTGCAAATAAAACCTCACCCATGAATGCTCACGCAAGTTTAATTACAGACCTGAA"; 

    int occurrences_A=std::count(DNA_Sequence.begin(), DNA_Sequence.end(), character_A);
    double probability_A =(double) occurrences_A/ DNA_Sequence.size();

    int occurrences_C=std::count(DNA_Sequence.begin(), DNA_Sequence.end(), character_C);
    double probability_C =(double) occurrences_C/ DNA_Sequence.size();

    int occurrences_G=std::count(DNA_Sequence.begin(), DNA_Sequence.end(), character_G);
    double probability_G =(double) occurrences_G/ DNA_Sequence.size();

    int occurrences_T=std::count(DNA_Sequence.begin(), DNA_Sequence.end(), character_T);
    double probability_T =(double) occurrences_T/ DNA_Sequence.size();


    cout<<"In the DNA sequence  \n\n["<<DNA_Sequence <<"]    \n\n\n" ;
    cout<<"The probability of ["<<character_A <<"] in the sequence   = "<<probability_A <<"  ("<<probability_A*100 <<"%)  ("<<occurrences_A<<" A's)  \n" ;
    cout<<"The probability of ["<<character_C <<"] in the sequence   = "<<probability_C <<"  ("<<probability_C*100 <<"%)  ("<<occurrences_C<<" C's)  \n" ;
    cout<<"The probability of ["<<character_G <<"] in the sequence   = "<<probability_G <<"  ("<<probability_G*100 <<"%)  ("<<occurrences_G<<" G's)  \n" ;
    cout<<"The probability of ["<<character_T <<"] in the sequence   = "<<probability_T <<"  ("<<probability_T*100 <<"%)  ("<<occurrences_T<<" T's)  \n\n" ;

    cout<<"Cross check : "<<(probability_A*100)<<"% + "<<( probability_C*100)<<"% + "<<( probability_G*100)<<"% + "<<( probability_T*100)<<
        "% = "<< (probability_A*100) + ( probability_C*100) + ( probability_G*100) + ( probability_T*100) <<"% \n";
    cout<<"Sequence size = "<<DNA_Sequence.size()<<"  (A + C + G + T = "<<occurrences_A+occurrences_C+occurrences_G+occurrences_T<<") \n\n";


    cout<<" \nPress any key to continue\n";

    cin.get();

   return 0;
}

输出:

In the DNA sequence

[ACAAGATGCCATTGTCCCCCGGCCTCCTGCTGCTGCTGCTCTCCGGGGCCACGGCCACCGCTGCCCTGCCCCTGGAGGG
TGGCCCCACCGGCCGAGACAGCGAGCATATGCAGGAAGCGGCAGGAATAAGGAAAAGCAGCCTCCTGACTTTCCTCGCTT
GGTGGTTTGAGTGGACCTCCCAGGCCAGTGCCGGGCCCCTCATAGGAGAGGAAGCTCGGGAGGTGGCCAGGCGGCAGGAA
GGCGCACCCCCCCAGCAATCCGCGCGCCGGGACAGAATGCCCTGCAGGAACTTCTTCTGGAAGACCTTCTCCTCCTGCAA
ATAAAACCTCACCCATGAATGCTCACGCAAGTTTAATTACAGACCTGAA]


The probability of [A] in the sequence   = 0.214674  (21.4674%)  (79 A's)
The probability of [C] in the sequence   = 0.334239  (33.4239%)  (123 C's)
The probability of [G] in the sequence   = 0.285326  (28.5326%)  (105 G's)
The probability of [T] in the sequence   = 0.165761  (16.5761%)  (61 T's)

Cross check : 21.4674% + 33.4239% + 28.5326% + 16.5761% = 100%
Sequence size = 368  (A + C + G + T = 368)


Press any key to continue