讓使用者輸入s,s為srand的seed,宣告一個int陣列有100個int,並利用亂數產生100~1000亂數100個
計算這一百個亂數的下列數值,且平均標準差為實數(double)
最大值\n
最小值\n
平均\n
標準差\n
#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)",他的寫法範例如下
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;
最後就只要再輸出值便可以達到目的了!
若是不確定答案的正確性,也可以先將陣列的項數變小,並先輸出每一個階段目前陣列與變數的值,來方便debug與驗證喔~那我們明天見!