2016-09-04 6 views
1

私はこのコードを持っています。私は乱数を持つ2つの配列を生成していて、arrayToString関数を使ってそれらの配列の中から2つの文字列を作成していますが、出力が奇妙です。乱数の生成が間違っていた

class job1Instance : public pp::Instance { 
public: 
     explicit job1Instance(PP_Instance instance): pp::Instance(instance) {} 
     virtual ~job1Instance() {} 

    virtual void HandleMessage(const pp::Var& message) { 
     // declare all the zises 
     int32_t minNum = 1; 
     int32_t maxNum = 100; 
     int32_t arrayElements = maxNum; 

     // the arrays 
     int32_t unsorted1[arrayElements/2]; 
     int32_t unsorted2[arrayElements/2]; 

     // fill the arrays with random numbers 
     unsortedArrays(unsorted1, unsorted2, arrayElements, minNum, maxNum); 
     std::string outRes1, outRes2, jsonStr; 
     arrayToString(unsorted1, arrayElements/2, outRes1); 
     arrayToString(unsorted2, arrayElements/2, outRes2); 
     PostMessage(pp::Var(outRes2)); 
    } 



private: 
    // function to create a random number between min and max 
    int32_t rangeRandomAlg (int32_t min, int32_t max) { 
     int32_t num = max - min + 1; 
     int32_t remainder = RAND_MAX % num; 
     int32_t x; 
     do { 
      x = rand(); 
     } while (x >= RAND_MAX - remainder); 
     return min + x % num; 
    } 

    // function to create arrays with random numbers 
    void unsortedArrays (int32_t unsorted1[], int32_t unsorted2[], int32_t arrayElements, int32_t &minNum, int32_t &maxNum) { 
     for(int32_t i = 0; i < arrayElements; i++) { 
      if (i < arrayElements/2) { 
       //unsorted1[i] = rangeRandomAlg(minNum, maxNum); 
       unsorted1[i] = rand() % maxNum + minNum; 
      } else { 
       //unsorted2[i] = rangeRandomAlg(minNum, maxNum); 
       unsorted2[i] = rand() % maxNum + minNum; 
      } 
     } 
    } 


    // convert the arrays to string 
    void arrayToString (int32_t array[], int32_t arraySize, std::string& arrayString) { 
     for (int i = 0; i <= arraySize; ++i){ 
      arrayString+= std::to_string(array[i]); 
      if (i != arraySize) { 
       arrayString+= ','; 
      } 
     } 
    } 

私のoutRes2出力にこれらの数字がある理由を教えてもらえますか?

-18700984、-18701112,8,0,2,0、-66124,0、-66124,0,267757568,0、-65608,0,1,0、-65608,0,266960448、 0、-66124,0,1,0、-18699984,0、-66124,0、-18699984,0,266959840,0,7、-66124、-18699984,0、-66124,0、-68200,0、 -18699984,0,266959360,0,1,0,536870911,0、私minNummaxNumが定義として彼らは1と100の間で明確ではありません-18700016,0,91

、私は見つけることができません問題。

+1

コードをデバッグしてステップアップしたときに、どのように見えましたか? –

+0

[最小完全な例](http://stackoverflow.com/help/mcve)に縮小しようとするとどうなりますか? – Beta

答えて

2

次の2つの配列、サイズarrayElements/2の各宣言:次のようにあなたのループがそれらを初期化し

int32_t unsorted1[arrayElements/2]; 
    int32_t unsorted2[arrayElements/2]; 

を:

 if (i < arrayElements/2) { 
      //unsorted1[i] = rangeRandomAlg(minNum, maxNum); 
      unsorted1[i] = rand() % maxNum + minNum; 
     } else { 
      //unsorted2[i] = rangeRandomAlg(minNum, maxNum); 
      unsorted2[i] = rand() % maxNum + minNum; 
     } 

したがって、ときのために例えば、iの値はarrayElements/2に、elseの値はifステートメントが実行される:unsorted2のサイズはarrayElements/2あるので

  unsorted2[arrayElements/2] = rand() % maxNum + minNum; 

を、この配列は、unsorted2[arrayElements/2-1]を介しunsorted2[0]値、及びこの割り当ては、未定義の動作を生じる、アレイの端部からはみ出す含ま。

+0

なぜ私はそれを私の自己見ていないのか分からない。もう1つの質問ですが、生成された数値が毎回実行された後に同じように維持される理由は分かりますか? – TalG

+1

乱数シード 'srand()'の初期化に失敗したためです。 –

+0

これは 'srand()'関数を初期化するために 'time_t time;'と 'srand(unsigned)time(&time))というトリックを行いました。 – TalG

-1

rand()は使用しないでください。近代的なバージョンを使用してください... それはすべてをより簡単にします! は、簡単なサンプルコードです:

#include <random> 
#include <iostream> 
#include <string> 

int main(){ 

    std::random_device now; 
    std::mt19937 engine(now()); 
    std::uniform_real_distribution<double> r(0, 100); //! 

    std::string str = std::to_string(r(engine)); 

    std::cout << str << std::endl; 

    system("pause"); 
    return 0; 
} 
+1

OPが 'rd()'の代わりに 'std :: uniform_real_distribution'を使った場合、それは何の違いもありませんでした。バグがあった場所ではないからです。 –

関連する問題