iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0
自我挑戰組

C++30日挑戰之旅系列 第 10

DAY10 利用陣列(Array)輸出亂數們的統計數值

  • 分享至 

  • xImage
  •  

題目:

讓使用者輸入s,s為srand的seed,宣告一個int陣列有100個int,並利用亂數產生100~1000亂數100個
計算這一百個亂數的下列數值,且平均標準差為實數(double)

最大值\n
最小值\n
平均\n
標準差\n

https://ithelp.ithome.com.tw/upload/images/20220911/20151593cQBNv0Vwsk.png


解法

#include <iostream>
#include <cmath>

using namespace std;


int main()
{
	int arr[100]={};//initial
    int s,i,max,min,t;
    t=0;
    double aver,sd;
    cin>>s;
    srand(s);
    
    max=99;
    min=1001;
    
    for(i=0;i<100;i++)
    {
    	arr[i]=rand()%901+100;
        t +=arr[i];
    }
    aver = t/100.0;
    
    for(i=0;i<100;i++)
    {
    	if(arr[i]>max)
        	max = arr[i];
        if(arr[i]<min)
         	min = arr[i];
    }
    double a,b;
    for (i=0;i<100;i++)
    {
    	a=arr[i]-aver;
        b=b+a*a;
    }
    b=b/100.0;
    sd = sqrt(b);
    cout<< max<<endl;
    cout<< min<<endl;
    cout<< aver<<endl;
    cout<< sd<<endl;
    
    return 0;
    
    }

解釋與詳細介紹

第一部分:陣列(array)介紹

這一題中我們會運用到一個新的技巧"陣列(array)",他的寫法範例如下

string cars[4] = {"Volvo", "BMW", "Ford", "Mazda"};//字串的陣列
cout << cars[0];//輸出Volvo
int myNum[3] = {10, 20, 30};//整數的陣列
cout << myNum[1];//輸出20

上述陣列是以中括號[]內的數字作為陣列大小(可以理解為"項數")、中括號前面的"名字"就是這個陣列的名字,且陣列裡的成員我們會以大括弧{},且運用逗號區隔每個成員。那在提到對應的順序時,便會輸出應對值。以cars與myNum為例

cars[0]="Volvo"、cars[1]="BMW"、cars[2]="Ford"、cars[3]="Mazda"
myNum[0]=10、myNum[1]=20、myNum[2]=30

並且也可以看到他的順序記位是從0開始到"陣列大小-1"(若陣列大小為"n",那起始範圍便是"0~n-1")這點比較需要注意。而本題會以"將亂數定義到我們所創建陣列的方式來計算其大小、平均與標準差值。

第二部分:主功能解析-變數、陣列定義與初始化

	int arr[100]={};
	int s,i,max,min,t;
	t=0;//t為計算總合(total)的變數
	double aver,sd;
	cin>>s;
	srand(s);
	
    	max=99;
    	min=1001;

首先我們定義了陣列arr的大小為100且令他的初始值為空陣列{}(代表裡面值為空,我們又稱為initialize,"初始化")若不這樣先行初始化的條件,會產生報錯。

並且我們令s為使用者輸入的seed值、i迴圈使用的變數、max與min分別代表最大最小值,aver與sd代表平均與標準差,且在亂數範圍介於100~1000的規定下,定義max設為99、min設為1001作為初始條件(稍後解析原因)。

第二部分:主功能解析-迴圈講解

        for(i=0;i<100;i++)
    	{
            arr[i]=rand()%901+100;
            t +=arr[i];
    	}
    	aver = t/100.0;

第一個迴圈中,我們將arr[i]依序由arr[0]~arr[100]放入了100~1000的隨機變數,且t作為每一項arr[i]值的總和(t +=arr[i];便是將每項累加的意思),最後便可以得到平均數(除數為100.0代表除完的結果為浮點數值)。

    	for(i=0;i<100;i++)
    	{
            if(arr[i]>max)
                max=arr[i];
            if(arr[i]<min)
                min = arr[i];
    	}
    	double a,b;
        
    	for (i=0;i<100;i++)
    	{
            a=arr[i]-aver;
        	b=b+a*a;
    	}
        b=b/100.0;
        sd = sqrt(b);

第二部分的迴圈中,我們將arr由0~99再跑過一次,且將其中經過>max(初始值為99)的值做為新的max值、< min(初始值為1001)的值做為新的min值。因為max與min值的初始值分別為99(也就是100~1000的範圍內皆比99大)、1001(100~1000的範圍內皆比1001小)因此if迴圈必定成立,待迴圈結束後便可以得到真正的最大最小值。

再來我們定義了兩個a,b變數以方便計算標準差值,a代表題目算式中"Xi-μ"、b為計算根號內運算的輔助變數。

	cout<< max<<endl;
	cout<< min<<endl;
	cout<< aver<<endl;
	cout<< sd<<endl;
	
	return 0;

最後就只要再輸出值便可以達到目的了!

第三部分:成果展示

https://ithelp.ithome.com.tw/upload/images/20220911/20151593f64INdsf3O.png

若是不確定答案的正確性,也可以先將陣列的項數變小,並先輸出每一個階段目前陣列與變數的值,來方便debug與驗證喔~那我們明天見!


參考資料:

  1. https://www.w3schools.com/cpp/cpp_arrays.asp

上一篇
DAY9 用C++來完成猜數字遊戲(下)
下一篇
DAY11 用c++來讀取/寫入檔案
系列文
C++30日挑戰之旅43
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言