2017-12-15 18 views
-3

高校のクラス割り当てをコーディングするときに、私はrand()を使用して静的結果を作成していることに気付きました。私のコードは、配列のための9つの乱数を作成し、それらを追加しています。rand()奇妙な結果を作成

#include <string> 
#include <iostream> 
#include <iomanip> 
#include <cstdlib> 
#include <ctime> 
using namespace std; 

int main() { 
    srand(time(NULL)); 
    int array[]={0}; 
    int i = 0; 
    while (i<9){ 
     array[i]={rand()}; 
     i++; 
    } 
    int loop=0; 
    int sum=0, num=0; 
    while (num<9){ 
    cout<<"Value "<<num<<": "<<array[num]<<"\n"; 
    sum=sum+array[num]; 
    num++; 
    } 

    cout<<"Sum of all values: "<<sum<<"\n"; 

    return 0; 
} 

このコードを使用すると、一部の値は同じように見え、他の値は最後と似ています。
Image1 Image2 Image3あなたが値0と3を見れば、彼らは常に4桁の数字を持っている、そして値1は常に0値2は常に2、残りがいかにのようにランダムであるように思われます。なぜこのようなことが起こっているのか?

+0

下記参照 'rand'は吸います。 'rand'の実装にはいくつかの特典があります。このコースを補完するために、この10年からC++の本を手に入れる時間。 –

+3

配列のサイズを9にしようとしてください(実際にそうであるように): 'int array [9] = {0};' – scohe001

+0

あなたは 'rand()'を余儀なくされましたか?最新の ''ライブラリは、あらゆる方法で優れています。 – Frank

答えて

2

境界外にある配列にアクセスしているため、未定義の動作に従事しています。

はこれを避けるために、9のサイズでそれを宣言します。

int array[9] = {0}; 
0

あなたの最初の問題は、あなたがあなたのint型配列を定義するとき、あなたは、その値が0だから内で1つの要素として、それを定義していますあなたのwhileループでは、あなたは既にメモリアウトオブバウンドから読み込んでいます。それらの汚れたアドレスからの値は不明です。

​​

長さ、私はあなたの境界を定義するためにの#defineまたはint型のconstを使用することをお勧めし9である整数配列を定義します。例えば、

#define MAXINDEX 9 
... 
    int array[MAXINDEX]; 
    ... 
    while (i < MAXINDEX){ 
    ... 
    while (num < MAXINDEX){ 
    ... 

又は

int const MAXINDEX(9);