如何找到随机整数中每个数字的出现次数?
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]);
【讨论】:
以上是关于如何找到随机整数中每个数字的出现次数?的主要内容,如果未能解决你的问题,请参考以下文章