2

このコードを実行すると、完全に乱数の行列は取得されませんが、代わりに多くの繰り返し数が取得されます。rainGen関数を使用して真にランダムな2D行列を生成する方法はありますか?あなたが提供できるどんな助けも本当に本当にありがたいです!

#include <iostream>
#include <cstdlib>
using namespace std;

const int MATRIX_ROW = 5;
const int MATRIX_COL = 5;

int** rainGen(int **theMatrix_ptr_ptr, int rows);

int main()
{
    int matrix[MATRIX_ROW][MATRIX_COL];
    int *matrix_ptr[MATRIX_ROW];
int **matrix_ptr_ptr = &matrix_ptr[0];
int rows = 3;

for (int count = 0; count < MATRIX_ROW; count++)
    matrix_ptr[count] = &matrix[count][0];

rainGen(matrix_ptr_ptr, rows);

return 0;
}

int** rainGen(int **theMatrix_ptr_ptr, int rows)
{
    srand(1023);

    for (int i = 0; i < rows; i++)
        for (int j = 0; j < MATRIX_COL; j++)
            *((*theMatrix_ptr_ptr + i) + j) = rand() % 100;

return theMatrix_ptr_ptr;
}
4

4 に答える 4

1

デバッグコードを追加しました。このint matrix[MATRIX_ROW][MATRIX_COL];ステートメントはメモリを割り当てますmatrixが、要素値を初期化しません。値は、以前のメモリ使用から残ったビットパターンになります。matrix要素の値を予期しない値のに初期化しました-1。最後に、を印刷しましたmatrix

#include <iostream>
#include <cstdlib>
using namespace std;

const int MATRIX_ROW = 5;
const int MATRIX_COL = 5;

int** rainGen(int **theMatrix_ptr_ptr, int rows);

int main()
{
     int matrix[MATRIX_ROW][MATRIX_COL];
     // initialize matrix elements to -1.
     for (int i = 0; i < MATRIX_ROW; ++i)
          for (int j = 0; j < MATRIX_COL; ++j)
               matrix[i][j] = -1;
     int *matrix_ptr[MATRIX_ROW];
     int **matrix_ptr_ptr = &matrix_ptr[0];
     int rows = 3; // error
     for (int i = 0; i < MATRIX_ROW; i++)
          matrix_ptr[i] = &matrix[i][0];
     rainGen(matrix_ptr_ptr, rows);
     // print matrix elements.
     for (int i = 0; i < MATRIX_ROW; ++i) {
          for (int j = 0; j < MATRIX_COL; ++j)
               cout << " [" << i << "," << j << "] " << matrix[i][j];
          cout << endl;
     }
     return 0;
}

int** rainGen(int **theMatrix_ptr_ptr, int rows)
{
     srand(1023);
     for (int i = 0; i < rows; i++)
          for (int j = 0; j < MATRIX_COL; j++)
               *((*theMatrix_ptr_ptr + i) + j) = rand() % 100; //error
     return theMatrix_ptr_ptr;
}

出力:

[0,0] 8 [0,1] 53 [0,2] 30 [0,3] 51 [0,4] 40 
[1,0] 88 [1,1] 60 [1,2] -1 [1,3] -1 [1,4] -1 
[2,0] -1 [2,1] -1 [2,2] -1 [2,3] -1 [2,4] -1 
[3,0] -1 [3,1] -1 [3,2] -1 [3,3] -1 [3,4] -1 
[4,0] -1 [4,1] -1 [4,2] -1 [4,3] -1 [4,4] -1 

matrixの値を持つ要素からわかるように、ランダムな値-1のすべての要素を与えているわけではありません。matrix

役立つヒントとして、特に関心のある2つのステートメントに// errorコメントを付けました。

問題を修正すると、出力は次のようになります。

[0,0] 8 [0,1] 14 [0,2] 19 [0,3] 36 [0,4] 99 
[1,0] 53 [1,1] 45 [1,2] 20 [1,3] 64 [1,4] 3 
[2,0] 30 [2,1] 51 [2,2] 40 [2,3] 88 [2,4] 60 
[3,0] 22 [3,1] 36 [3,2] 42 [3,3] 1 [3,4] 49 
[4,0] 96 [4,1] 24 [4,2] 48 [4,3] 92 [4,4] 46 
于 2013-03-25T09:11:57.593 に答える
0

srand()を関数から外すべきだと思います

int** rainGen(int **theMatrix_ptr_ptr, int rows)

main()に入れる必要があります。

別の方法:

srand(1234)をsrand(time())に変更できます

しかし、あなたはしなければなりません

#include <time.h>

最初

于 2013-03-25T05:15:14.217 に答える
0

srand()はランダムジェネレータを再初期化します。現在の時刻をsrand()のパラメーターとして使用できます。それはあなたの問題を解決します

于 2013-03-25T05:19:10.973 に答える
0

あなたの質問の私の理解によると。私はあなたにいくつかのコードを提供しました。これはあなたに役立つかもしれません。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    --------->int <---------
    main (int argc, char *argv[])
    {
      /* Simple "srand()" seed: just use "time()" */
      unsigned int iseed = (unsigned int)time(NULL);
      srand (iseed);

      /* Now generate 5 pseudo-random numbers */
      int i;
      for (i=0; i<5; i++)
      {
        printf ("rand[%d]= %u\n",
          i, rand ());
      }
      return 0;
    }

 /*
     * rand: Generates 5 numbers using standard "srand()/rand()" function
     *
     * SAMPLE OUTPUT:
     *   rand[0]= 824522256
     *   rand[1]= 1360907941
     *   rand[2]= 1513675795
     *   rand[3]= 1046462087
     *   rand[4]= 253823980
     */
于 2013-03-25T07:24:09.323 に答える