所以我正在尝试制作一个基本程序来学习C ++的基础知识,我从0到100生成100个随机数并将它们存储在一个向量中,然后我显示总和,均值,中位数,模式,向量的高低。除了我遇到困难的模式之外,我还完成了其他所有工作。这是我到目前为止的代码。
int modeFunction()
{
numMode = 0;
count = 0;
for (int n = 0; n < 100; n++)
{
for (int y = 0; y < 100; y++)
{
if (numVector.at(y) == numVector.at(n))
{
numMode = numVector.at(y);
count++;
}
}
}
return numMode;
}
之后我被卡住了,因为在我看来它应该有效,但事实并非如此。它只是输出最后一个数字,通常为100.任何帮助都会非常感激。
答案 0 :(得分:7)
由于所有值都在0到100之间,因此您可以使用直方图有效地找到模式:
std::vector<int> histogram(101,0);
for( int i=0; i<100; ++i )
++histogram[ numVector[i] ];
return std::max_element( histogram.begin(), histogram.end() ) - histogram.begin();
答案 1 :(得分:5)
由于模式是最常出现的数字,因此除非新号码的数量大于numMode
的数量,否则不应更改numMode
。
编辑:为了澄清,您需要为当前元素和您认为是模式的当前数字保留单独的计数。理想情况下,将newMode
设置为第一个元素是一种很好的方法。
此外,模式不是必需的唯一(即“1 1 2 2”)。如果你关心这一点,你可能想要记住这一点。
newMode = element[0]
modeCount = # of occurrence of newMode
for ( i-th element from [1 to end] ) {
tmpCount = # of occurrence of element[i]
if tmpCount > modeCount {
newMode = element[i]
modeCount = tmpCount
}
}
答案 2 :(得分:1)
你的算法是错误的 - 它输出数组中的最后一个数字,因为这是它所能做到的。每次索引y
处的数字与索引n
处的数字匹配时,您都会覆盖之前n
的结果。由于您使用的是相同的循环条件,因此对于每个可能的y
值,n
和n
始终始终在嵌套循环中的至少一个点上相同 - 并且您最终会numMode
为numVector.at(99)
。
您需要更改算法以保存每个n
索引的计数(或至少哪个n
索引以最大count
结束),以便您可以在n
循环结束时知道哪个条目出现次数最多。
答案 3 :(得分:1)
替代解决方案。注意:未经测试。
int mode1(const std::vector<int>& values)
{
int old_mode = 0;
int old_count = 0;
for(size_t n=0; n < values.size(); ++n)
{
int mode = values[n];
int count = std::count(values.begin()+n+1, values.end(), mode);
if(count > old_count)
{
old_mode = mode;
old_count = count;
}
}
return old_mode;
}
int mode2(const std::vector<int>& values)
{
return std::max_element(values.begin(), values.end(), [](int value)
{
return std::count(values.begin(), values.end(), value);
});
}
答案 4 :(得分:1)
typedef std::pair<int, int> mode_pair;
struct mode_predicate
{
bool operator()(mode_pair const& lhs, mode_pair const& rhs)
{
return lhs.second < rhs.second;
}
};
int modeFunction()
{
std::map<int, int> mode_map;
for (int n = 0; n < 100; n++)
mode_map[numVector[n]]++;
mode_predicate mp;
return std::max_element(mode_map.begin(), mode_map.end(), mp)->first;
}
答案 5 :(得分:0)
模式表示频率最高的数字。逻辑应该是 -
//Start of function
int mode = 0, globalCount = 0 ;
// Start of outer for loop
for i = 0 to length - 1
int localCount = 0
// Start of inner for loop
for j = 0 to length - 1
if vec[i] == vec[j]
++localCount
// End of Inner for loop
if ( localCount > globalCount )
globalCount = localCount
mode = vec[i]
// End of outer for loop
if globalCount > 1 // This should be checked whether vec has repetitions at all
return mode
else
return 0
// End of function
答案 6 :(得分:-1)
int number = array_list[0];
int mode = number;
int count = 1;
int countMode = 1;
for (int i=1; i<size_of_list; i++)
{
if (array_list[i] == number)
{ // count occurrences of the current number
count++;
if (count > countMode)
{
countMode = count; // mode is the biggest ocurrences
mode = number;
}
}
else
{ // now this is a different number
if (count > countMode)
{
countMode = count; // mode is the biggest ocurrences
mode = number;
}
count = 1; // reset count for the new number
number = array_list[i];
}
}