1

1 から 6 までの 4 つの値のテーブルが必要です。

私は使用しています:rand() % 6 + 1;

これにより、1 ~ 6 の値が得られるはずです。

rand()値 0 を生成する場合を除きます。

  1. 私は7を取得し続けます。セブンはいらない

  2. ランドの範囲は?0 値を生成しないようにするにはどうすればよいですか?

  3. 代替ソリューションは大歓迎です。

  4. 先生は「ランダム」を使う手がかりを教えてくれました。
    学校では Borland C++ Builder 5 を使用しています。
    自宅で Dev-C++ 5.3.0.3 を使用しています。
    それらがどのように機能するかにはいくつかの違いがあることがわかりましたが、それは奇妙だと思います..
    random() を使用できません。スコープで宣言されていません...

    int main (){
    
        int I;
        int Fasit[3];
    
        srand (time(NULL) );
    
        for(I=0; I<4; I++) {
            Fasit[I]=rand() % 6 + 1;
        }
    
        std::cout << Fasit[0] << " " << Fasit[1] << " " << Fasit[2] << " " << Fasit[3] << " ";
    
        return 0;
    }
    

私が得るいくつかの値:

2 6 1 7  
5 2 1 4  
5 2 1 4  
5 2 1 4  
1 3 1 6  
5 3 3 7  
5 3 3 7  
5 3 3 7

7はありえないはずですよね?

PS: 私のプリントはハムフィストであることはわかっています。数の生成が機能したら、もう少しエレガントにします。

4

4 に答える 4

9

次の行を検討してください。

int Fasit[3];
for(I=0; I<4; I++) {
  Fasit[I]

3 つのエントリの配列を宣言し、 4回書き込みます。

プログラムをもう一度試してみてください。

int Fasit[4];
于 2013-01-30T20:39:02.100 に答える
2
int Fasit[3];

インデックス 0、1、または 2 でのみアクセスできるサイズ 3 の配列を作成しています。

あなたは未定義の振る舞いをする Fasit[3] を書いたり読んだりしています。動作が定義されていない場合、奇妙な結果が得られることは間違いありません。これです。

于 2013-01-30T20:41:57.297 に答える
2

Fasit[3]Fasit[0]Fasit[1]、およびのみにアクセスできますFasit[2]

へのアクセスFasit[3]は、読み取りと書き込みのいずれかで、未定義の動作です。Fasit[3]あなたのコードは:-)への書き込みと読み取りの両方です。プログラムは範囲外の配列にアクセスしています。修理する!

なぜ7が印刷されているかというと、それは単なる偶然です。期待どおりFasit[0-3]の範囲で常に出力されることに注意してください。1-6

以下も参照してください。

于 2013-01-30T20:43:54.490 に答える
2

Fasit[3] には 3 つの要素しかありません。Fasit[3] に書き込みを行うと、未定義の動作の領域に入ります。この場合、明らかに矛盾していることを示しています。

于 2013-01-30T20:40:15.007 に答える