0

私の本には次の問題がありました。

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
void main()
{
    clrscr();
    randomize();
    int Game[]={10,16},P;
    int Turn=random(2)+5;
    for(int T=0;T<20;T++)
       {
           P=random(2);
           cout<<Game[P]+Turn<<"#";
       }
getch();
}

出力は 16#22#16#16#16#22#....20 回のようになります... なぜこの出力は常に 16# または 22# のいずれかになるのですか?? なぜ15#または21#ではないのですか?? このプログラムの仕組みを知りたいです。ありがとう。ターン=ランダム(2)+5; random(2) が 0 を与える場合、ターンは turn=0+5=5 になります。これは、10+5=15 と 16+5=21 を 16 と 22 と共に取得する必要があることを意味しますが、取得していません。

私たちはコンピュータ サイエンス理論の試験で上記の質問を受け、正しい答えを選択する必要がありました (つまり、16 と 22 を生成します)。 21も可能です..

4

4 に答える 4

1

たぶんこれが役立ちます:

乱数発生器のシードが設定されていません。

srand(time(NULL)) を呼び出すと、よりランダムな結果が得られます

C++ rand() は、プロセスの実行時に同じ数を返します

于 2013-03-21T14:05:30.490 に答える
1

コンピューターはそれ自体で数値をランダム化することはできません。そのためにシードを使用します。

ただし、シードは完全にランダムではなく、次のような特定の順序があります。

1
2
8
5
4

これらの数字はかなりランダムに見えますが、次にプログラムを実行すると次のようになります。

1
2
8
5
4

まったく同じ。

これを防ぐために、時間をシードとして使用します。時間は常に変化するため、常に新しい数値が生成されます。

#include <time.h>
srand(time(NULL));  // srand is the function to randomize numbers from a seed, we use 'time' as seed here

このビデオはそれを説明しています。

于 2013-03-21T14:16:00.280 に答える
1

seed「本当に」ランダムにするのに役立つ値を指定する必要があります。ママたち

于 2013-03-21T14:06:33.493 に答える
0

Turnループの開始時に一度だけランダム化されるためです。の割り当てをループに移動すると、以下もTurn取得する必要が15あります。21

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
void main()
{
    clrscr();
    randomize();
    int Game[]={10,16},P;
    int Turn;
    for(int T=0;T<20;T++)
       {
           P=random(2);
           Turn=random(2)+5;
           cout<<Game[P]+Turn<<"#";
       }
    getch();
}

また、他の人が言ったように、実行ごとに出力を変えたい場合は、シードsrand()で呼び出すなどして、乱数ジェネレーターをシードする必要があります。例えば:

#include <time.h>
(...)
srand(time(NULL));
于 2013-03-21T14:11:17.890 に答える