【问题标题】:count frequency random numbers which specific range in c array计算c数组中特定范围的频率随机数
【发布时间】:2019-09-02 20:12:16
【问题描述】:

我正在尝试计算特定区域中数字的频率,例如 0

我尝试在 for 循环中使用 if 块并尝试递增 main(){int sum=0;}

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
    int a[5]={0};
    int i,n,sum=0;
    srand(time(NULL));

    for(i=1;i<=50;i++)
    {
        n=1+rand() % 100;
        a[n/20]++;

    }
    for(i=0;i<5;i++)
    {
        if(0<=a[i]<=16){
            sum++;
        }


    } printf("%d",sum);
}

我应该在输出上得到不同的数字,但输出总是相同的数字“5”

【问题讨论】:

  • n==100a[n/20]++; 是UB,因为它试图在其范围之外访问a[]
  • 请注意1 + rand() % 100 永远不会生成 0。我也不确定问题的“like 0n == 100 的情况)。它是在寻找两个特定的范围:0..15 和 87..100,还是在寻找具有 6 组值的模糊相似的范围——0..15、16..31、32..49、50.. 65、66..83、84..100 还是什么? (问题要求 87 而不是 84 左右,我不确定这应该如何工作,特别是因为代码使用 5 个范围,名义上是 0..19、20..39、40..59、60..79, 80..99.)
  • 是的 100 不算在范围内,它在 0-100 之间,应该是 5 个特定范围,但这些范围不会定期增加。
  • 那么你需要扩展你的问题来解释这5个不规则范围是如何定义的。您可能应该从n 的计算中删除1 +。而n/20 将不正确。然后不清楚为什么您只想要有 16 个或更少样本的范围的计数 - a[i] &gt;= 0 条件将始终为真,因为数组被初始化为零并且元素永远不会递减。以换行符 ("%d\n") 结束 printf() 格式字符串通常是个好主意;它有助于确保及时生成输出(并且不会搞砸命令行提示)。
  • 通常在调试时添加一些额外的打印是个好主意(比如打印数组初始化,打印任何匹配条件的a[i])。

标签: c


【解决方案1】:
if(0<=a[i]<=16){

不是正确的表达方式。它始终为真,因为 (0

if ((a[i] >= 0) && (a[i] <= 16))

顺便说一句,请始终注意编译器警告。在这种情况下,它准确地告诉了我问题所在。

【讨论】:

    猜你喜欢
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    相关资源
    最近更新 更多