如何找到随机整数中每个数字的出现次数?

Posted

技术标签:

【中文标题】如何找到随机整数中每个数字的出现次数?【英文标题】:How to find the number of occurrences of each digit in a random integer? 【发布时间】:2020-04-05 03:52:26 【问题描述】:

我做了一个简单的随机程序,生成一个 0 到 9 之间的随机数

int random_x;

int main(int argc, char* argv[])
    
 srand ( time(NULL) );

for (int t=0;t<10;t++)
 
    random_x = rand() % 10; //generate 10 random integers between 0 and 10
    cout << "\n" << random_x;


下一个阶段是设置一个整数数组来计算每个数字出现了多少。例如,如果随机数是 144566888,那么输出将是

1 appears 1 time 
4 appears 2 times
5 appears 1 time
6 appears 2 times
8 appears 3 times

这是我尝试过的,但它返回“数字出现 0 次”

int count[random_x] = 0;

while ( random_x > 0)   //loop to return how many times a number appears
    count[ random_x % 10]++;
     random_x =  random_x / 10;
     cout <<"Digit occurs: " << random_x << " times" << endl;

【问题讨论】:

请注意,您生成了 10 个随机数,但在您的示例中仅包含 9 个。此外,您需要找到数组中的不同元素以及每个元素的计数/频率。 @Anirban166 我该怎么做呢?我不确定 您可以使用unordered_set 来存储唯一值并计算由集合大小给定的数组中的出现次数。您是否受到一些时间复杂度限制?这可以在两个循环中实现,但复杂度将是二次的。如果一定要使用优化的逻辑,我更喜欢第一种方式。 (它存储独特的元素) @Anirban166 不,我没有时间限制 好吧,我会尽快写一个解决方案。 【参考方案1】:

这个想法只是保持一个计数数组(最初都是零)并在生成每个数字时更新它们。然后,最后,输出这些计数。

这样的事情会是一个好的开始:

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

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

    // Count accumulators, all originally zero.

    int count[10];
    for (int i = 0; i < 10; ++i)  // or 'int count[10] = 0' above.
        count[i] = 0;
    

    // Process random digits, printing and accumulating.

    std::cout << "Generating random digits:";
    for (int i = 0; i < 10; ++i) 
        int digit = rand() % 10;
        std::cout << " " << digit;
        count[digit]++;
    
    std::cout << "\n";

    // Output the statistics.

    for (int i = 0; i < 10; ++i) 
        if (count[i] == 1) 
            std::cout << "    Digit " << i << " occurs 1 time.\n";
        
        else if (count[i] > 0) 
            std::cout << "    Digit " << i << " occurs " << count[i] << " times.\n";
        
    

正如预期的那样,几次运行的输出是:

Generating random digits: 6 1 5 8 9 2 8 0 5 3
    Digit 0 occurs 1 time.
    Digit 1 occurs 1 time.
    Digit 2 occurs 1 time.
    Digit 3 occurs 1 time.
    Digit 5 occurs 2 times.
    Digit 6 occurs 1 time.
    Digit 8 occurs 2 times.
    Digit 9 occurs 1 time.

Generating random digits: 3 4 0 1 3 3 9 9 5 7
    Digit 0 occurs 1 time.
    Digit 1 occurs 1 time.
    Digit 3 occurs 3 times.
    Digit 4 occurs 1 time.
    Digit 5 occurs 1 time.
    Digit 7 occurs 1 time.
    Digit 9 occurs 2 times.

Generating random digits: 7 7 9 7 3 7 4 3 7 4
    Digit 3 occurs 2 times.
    Digit 4 occurs 2 times.
    Digit 7 occurs 5 times.
    Digit 9 occurs 1 time.

【讨论】:

在 OP 给出的输出中,只提到了不同的元素及其各自的计数。你的count[10] 也存储了欺骗的数量,所以我想这不是必需的。 我运行了这段代码,结果出现了 0 次数字。 @David,看来您没有将其正确组合到您自己的中。您添加到问题中的代码将不起作用,因为您需要评估所有随机数并 之后 输出整个计数数组。无论如何,我对数字的来源存在误解(一个大数字而不是许多一位数字),所以我现在将其更改为一个完整的独立程序(也有输出)为了更好地向你展示我的意思。【参考方案2】:

您的问题与计算数组中每个唯一位的出现次数有关。

对此有不同的方法,一种是使用unordered_set(存储唯一值)来存储不同的元素并计算唯一元素的总数来获得数组大小,这样我们就可以为每个不同的元素分配一个计数器。

由于您不受时间限制,因此更容易实现两个循环,外部循环遍历所有元素,内部循环首先检查重复项(使用数组检查频率状态)并分别计算每个唯一元素的出现. (然后将计数值传输到频率保持数组,并在每次迭代时相应地打印值)

// your rng-based digits in an array:
int a[9]=1,4,4,5,6,6,8,8,8;

// For checking unique/distinct digits first, and later on to hold the frequency as transferred by count:
int frequency[9]=-1,-1,-1,-1,-1,-1,-1,-1,-1;

    // Our counter variable, but counts will be transferred to frequency[] later on:
    int count;

    for(int i=0; i<9; i++)
       // Each distinct element occurs once atleast so initialize to one:
        count = 1;
        for(int j=i+1; j<9; j++)
        
            // If dupe is found: 
            if(a[i]==a[j])
            
                count++;

                // Ensuring not to count frequency of same element again:
                frequency[j] = 0;
            
        

        // If frequency of current element is not counted:
        if(frequency[i] != 0)
            frequency[i] = count;
    

    for(int i=0; i<9; i++)
    
        if(frequency[i] != 0)
            printf("%d appears %d times\n", a[i], frequency[i]);
    

【讨论】:

以上是关于如何找到随机整数中每个数字的出现次数?的主要内容,如果未能解决你的问题,请参考以下文章

java问题 输入20个10以内的正整数,输出每个数字出现的次数。急!!!

从1到N整数中1出现的次数

ccf数字排序

如何在洗牌的连续整数数组中找到重复元素?

CCF201503-2数字排序

CCF 201503-2 数字排序