-4

関数を使用して擬似ランダム int を生成しようとしていrand()ます。それは機能しますが、私の問題は、int に対して常に同じ名前を「選択」していることです。(この場合は41です。mainrand()のwhileループに入れると85くらいだと思います。)

これを修正する方法はありますか?これが私のコードです:

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

    int guess;
    int danse = rand() % 101;

    using namespace std;

    void more(){
    cout << "The number that you need to guess is higher!";

    return;
    }

    void lower(){
    cout << "The number that you need to guess is lower!";

    return;
    }

    int main(){
    while(1){
    cout << "\nGuess a number 0-100: ";
    cin >> guess;

    if (guess > danse){
        lower();
}
    if (guess < danse){
        more();
}

    if (guess == 101){
        break;
}

    if (guess == danse){
        cout << "\nYOU GUESSED IT. ARE YOU A WIZARD?! BECAUSE THAT IS PRETTY NEAT.";
        break;
}
    }
    }

いくつかの補足事項: void 関数をリターン付きで使用している理由を説明するなど、私が既に知っていることを教えようとしないでください。また、namespace std; を使用することを私に納得させようとしないでください。それを行う「悪い」方法です。他にも方法があることは理解しています。私はしないことを選択します。

ありがとう!

4

3 に答える 3

5

を使用する前にsrandを 1 回呼び出して、乱数ジェネレーターをシードする必要がありますrand。現在の時刻は、プログラムの実行ごとに異なるシードを選択する安価で簡単な方法です。

int danse;

int main(){
    srand(time(NULL));
    danse = rand() % 101;
于 2013-08-16T18:16:09.130 に答える
2

rand()指定されたシードから始まる疑似乱数シーケンスを生成します。指定されたシードの場合、次の値はすべて同じになります。デフォルトでは、シードは 1 です。

プログラムを実行するたびに異なる値を取得するにはsrand()、ユーザーの観点からランダムに見えるものを ( を使用して) ジェネレーターにシードする必要があります。Unix マシンでの最善の解決策は、 から十分なバイトを読み取って "/dev/random"を作成しint、それを使用することです。他のシステムでは、別のものを見つける必要があります。time( NULL )は古典的な解決策ですが、もちろん、プログラムが同じ秒間に数回 (異なるマシン上であっても) 開始されると、同じシーケンスが出力されます。プロセス ID、マシンの IP アドレスなどの追加の値をハッシュすると、状況が大幅に改善されます。

最後に: 一部のジェネレーターはシードを最初の値として返します。特に を使用するだけの場合、これは非常に予測可能です time( NULL )。おそらく、実際に使用する前に破棄するいくつかのランダムな値を生成したいと思うでしょう。

于 2013-08-16T18:24:18.487 に答える
1

乱数ジェネレーターが表示されていないため、アプリケーションを実行するたびにまったく同じ「乱数」のセットが得られます (これはデバッグに役立ちます)。これを修正するには、メインを次のように変更します。

int danse = 0;
int main()
{
    std::srand(std::time(0)); // seed the random number generator
    danse = rand() % 101;
    // rest of your main
}
于 2013-08-16T18:19:39.657 に答える