C++ - 使频率加起来达到 1 的漂亮方法

C++ - Pretty way to make frequencies add up to 1

本文关键字:漂亮 方法 起来 频率 C++      更新时间:2023-10-16

>编辑:感谢您非常快速的回答!
确实理解这些数字是如何表示的,以及为什么可以观察到这样的结果。我的问题实际上是关于使它们加起来达到 1.0 的方法。


我有一个由 4 个字母 A、C、G 和 T.I
组成的字母表,将它们计算起来,因此有总字母计数和每个单独的计数。

unsigned int A_count; //initialized
unsigned int C_count; //initialized
unsigned int G_count; //initialized
unsigned int T_count; //initialized
//a bit hacky, enables floating point division
double total_count = A_count + C_count + G_count + T_count;

然后,我尝试计算它们的频率:

double A_frequency = A_count / total_count;
double C_frequency = C_count / total_count;
double G_frequency = G_count / total_count;
double T_frequency = T_count / total_count;

但这并不总是对我有用,因为频率的总和可以大于 1,我需要它完全等于 1.0。


示例 :

std::cout << "Result : " << A_frequency + C_frequency + G_frequency + T_frequency << std::endl;
Result : 1.000[...]01

我需要它来生成此处记录的模因文件(模因文件格式)。
可以在相关部分阅读:

由于每行都包含字母表中每个字母的概率,因此该行中的概率总和必须为 1。

正如@TonyK在评论中指出的那样,尽管文档说了什么,但 MEME 文件本身并不需要总和正好为 1.0。

但就我而言,模因文件只是被创建为另一个程序的输入,该程序需要频率的总和正好为 1.0。


有什么好/漂亮的方法可以做到这一点吗?如果没有,为什么?

(这是我关于stackoverflow的第一篇文章,如果有什么问题,请告诉我,我会纠正的,谢谢)

您可以使用存储分子(= 单个字母的计数)和分子(= 总计数)的分数类型。通过这种方式,您可以确定将频率相加后,您将获得 1( = 总数/总计数)。

实际上,我会考虑是否真的值得首先努力计算频率。您也可以只存储计数,并且仅在需要时将它们除以计数总数。