【问题标题】:How to count the frequency of the number x如何计算数字x的频率
【发布时间】:2019-08-12 04:32:42
【问题描述】:

我想打印第一个数到4的数字,例如我有这个随机函数,我想查看第一个达到4次的数字。所以这是第一个打印自己 4 次的数字。例如:

    int n;
    int count1 = 0;
    int count2 = 0;
    int count3 = 0;
    while (true) {
        cout << "Enter a number btween 1-3" << endl;
        cin >> n;
        if (n == 1) {
            count1++;
        }
        if (n == 2) {
            count2++;
        }
        if (n == 3) {
            count3++;
        }
        if (count1 == 4) {
            cout << "You printed the number 1 4 times!";
            break;
        }
        if (count2 == 4) {
            cout << "You printed the number 2 4 times!";
            break;
        }
        if (count3 == 4) {
            cout << "You printed the number 3 4 times!";
            break;
        }

但是如果是 1-1000 个数字而不仅仅是 1-3,我会怎么做呢?

我想这样做,但在一个随机函数上 - 该数字的计数是 4 次的第一个数字打印该数字 -

int fun() {
    srand(time(NULL));
    return rand() % 3;
}

然后我想在 main 中执行第一个达到例如 4 次的数字打印这个数字。

我试着做这样的事情:

for (int i = 0; i < 31; i++) {
        arr[fun()]++;
        cout << arr[fun()];
        if (arr[fun()] == 4) {
            cout << arr[fun()];
        }
    }

【问题讨论】:

  • 如果是 1000 个数字,您将使用 for 循环。
  • @Axium 你错过了整点
  • 我不回答,我建议。
  • 他使用了一个数组,这需要与向量几乎相同的工作量。我只是建议一些代码。
  • 看,这家伙切换到矢量了。

标签: c++ counter


【解决方案1】:

您可以为此使用一个集合(例如向量),而不是一千个单独的变量 :-)

首先,如果您想要1..3 范围内的随机数,您可以使用(rand() % 3) + 1。但是,您可以使用范围 0..n-1 而不是 1..n,并在循环后调整值。

第一步是创建每个数字的计数并将其初始化为零:

const int SZ = 1000;
std::vector<int> count(SZ, 0);

然后你的循环只是生成随机数并调整相关计数,直到其中一个达到目标值:

int num;
for (;;) { // infinite loop
    num = rand() % SZ;
    ++count[num];
    if (count[num] == 4)
        break; // exit infinite loop when one of them reaches four.
}

然后你只需简单地输出第一个达到四的那个。请注意,由于我们正在执行0..999,因此我们将其映射1.1000

std::cout << ++num << " reached a count of four first\n";

一个完整的程序显示如下:

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>

int main() {
    srand(time(nullptr));

    const int SZ = 1000;
    std::vector<int> count(SZ, 0);

    int num;
    for (;;) { // infinite loop
        num = rand() % SZ;
        ++count[num];
        if (count[num] == 4)
            break; // exit loop when one of them reaches four.
    }

    std::cout << ++num << " reached a count of four first\n";
}

一个示例运行(确保延迟,以便随机数生成器获得不同的种子):

>> for i in {1..10} ; do sleep 1 ; ./testprog ; done )
296 reached a count of four first
520 reached a count of four first
205 reached a count of four first
239 reached a count of four first
822 reached a count of four first
260 reached a count of four first
421 reached a count of four first
444 reached a count of four first
21 reached a count of four first
92 reached a count of four first

【讨论】:

  • 我知道rand()来自帖子,但是为什么要使用#define而不是const
  • @dyukha,我最初是用 C 语言用数组编写的。当我看到标签时转换为 C++ :-)
  • @paxdiablo,使用std::vector&lt;int&gt; count{SZ, 0},不是比push_back() 1000 次更好吗?
  • @SomeGuy,它有效,但在大型程序中可能会导致不良后果。不要使用randstackoverflow.com/a/26440334/2956272,更喜欢const而不是definestackoverflow.com/a/14041847/2956272,不要使用c风格的数组:stackoverflow.com/a/18869117/2956272
  • @SomeGuy,我建议你重新检查你正在运行的代码。我给出的代码已经运行了几百次没有错误。
【解决方案2】:

最后一个答案超出范围。我的答案是只使用一个数组

while(1) {
        int f = rand() % 3;
        count[f]++;
        cout << f << endl;
        if (count[f] == 4) {
            cout <<"4 times" <<f;
            break;
        }
    }

【讨论】:

  • @Axium 因为没关系。但是如果你想要一个while循环肯定会。
  • @Axium 只是我不明白它的可读性如何。我想 1 年前我可以,但现在看起来还是一样。
  • @Axium: for(;;) 也是字面意思,应该理解。 for 循环没有前导码、终止条件和迭代后处理。由于它会在很多代码中看到,因此开发人员应该努力学习它:-)
  • "最后一个答案超出范围" - 需要解释一下吗? @paxdiablo 的答案在[1, 1000] 范围内给出了答案,正如我所要求的那样,并且没有超出范围的问题。
  • @SomeGuy 哦,我明白你的意思了。我在上一个答案中发现了一个微妙的错误,并(希望)修复了它。
猜你喜欢
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
相关资源
最近更新 更多