2017-11-19 3 views
-1

それぞれ乱数を持つ構造体の配列を持つ異なるオブジェクトを作成しようとしています。コンパイルした後、すべてのオブジェクトの配列内に同じ番号のシーケンスが得られます。
配列内に固有のシーケンス番号を持つ異なるオブジェクトを作成する方法はありますか?一意の乱数を持つ構造体の配列を持つ複数のオブジェクトを作成する

#include <iostream> 
    #include <time.h> 
    #include <stdlib.h> 
    using namespace std; 

    struct storeTwoValue 
    { 
      int x; 
      int y; 
    }; 


    class practice{ 
    public: 
    storeTwoValue storageArray[10]; 
    void valueGenerator() 
    {  srand(time(NULL)); 
      for (int i = 0; i< 10; i++) 
      { 
        storageArray[i].x = rand()%10 +1; 
          storageArray[i].y = rand()%7 + 1; 
        } 
      } 

      void print() 
      { 
        cout<<"x"<<" "<<"y"<<endl; 
        for (int i = 0; i< 10; i++) 
        { 
          cout<<storageArray[i].x <<"  "; 
          cout<< storageArray[i].y << endl; 
        } 
        cout<<endl; 

      } 
    }; 

     int main() 
    { 
      for(int i=0; i<3; i++) 
      {  practice A; 
        A.valueGenerator(); 
        A.print(); 
      } 
      return 0; 
    } 

答えて

1

srand()コールをメインに移動します。つまり、一度だけ実行します。
あなたがそれを使用している方法では、少なくとも最初にすべてを作成/初期化すると、オブジェクトごとに短い順序で呼び出されます。私。彼らはすべてtime(0)が同じシードを与えている間にすべて初期化されます。つまり、擬似乱数ジェネレータは基本的にリセットされます(同じ初期値から同じシーケンスを開始します)。

これを確認するには、(srand呼び出しを移動する前に)ループを延長することができます。 time(0)が確実に異なる値を持つように十分な時間がかかる場合は、グループ内では同じ値を持ちグループ間で異なるオブジェクトのグループが表示されます。

srand()を呼び出すのは、一度だけ行う必要があります。それを頻繁に呼び出すとランダム性が向上しません。

関連する問題