C++ - 使频率加起来达到 1 的漂亮方法
C++ - Pretty way to make frequencies add up to 1
>编辑:感谢您非常快速的回答!
我确实理解这些数字是如何表示的,以及为什么可以观察到这样的结果。我的问题实际上是关于使它们加起来达到 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( = 总数/总计数)。
实际上,我会考虑是否真的值得首先努力计算频率。您也可以只存储计数,并且仅在需要时将它们除以计数总数。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- C++ - 使频率加起来达到 1 的漂亮方法
- 用 c++ 编写一堆类似的 if 语句的漂亮方法
- 迭代无符号整数的所有值的最漂亮的方法