4

こんにちはstackoverflowの親愛なるメンバー私は最近C++を学び始めました、今日私は小さなゲームを書きましたが、私のランダム関数は正しく動作しません。ランダム関数を複数回呼び出すと、代わりに数値が再生成されず、同じ数値が何度も出力されます。forループを使用せずにこの問題を解決するにはどうすればよいですか?ありがとう

#include "stdafx.h"
#include <iostream>
#include <time.h>
using namespace std;
int rolld6();

int main()
{
    cout<<rolld6()<<endl;
    cout<<rolld6()<<endl;
    system("PAUSE");
    return 0;

}

int rolld6()
{
    srand(time(NULL));
    return rand() % 6 + 1;;
}
4

3 に答える 3

11

srand(time(NULL));通常、開始時に1回main()実行し、二度と実行しないでください。

rolld6あなたがそれを持っている方法はあなたが同じ秒で呼び出すたびにあなたに同じ番号を与えるでしょう、それは多くの場合でありえます、そしてあなたのサンプルでは、​​あなたがそれを素早く連続して2回呼び出すのでほぼ保証されます。

これを試して:

#include "stdafx.h"
#include <iostream>
#include <time.h>
#include <stdlib.h>

int rolld6 (void) {
    return rand() % 6 + 1;
}

int main (void) {
    srand (time (NULL));
    std::cout << rolld6() << std::endl;
    std::cout << rolld6() << std::endl;
    system ("PAUSE");
    return 0;
}

もう1つ覚えておくべきことは、このプログラム自体を2回続けて実行する場合です。時間が変更されていない場合は、両方の実行で同じ2つの数値が得られます。これは通常、プログラムを複数回実行するスクリプトがあり、プログラム自体が短命である場合にのみ問題になります。

たとえば、system()電話を切り、それを3回呼び出すcmd.exeスクリプトがある場合、次のように表示される可能性があります。

1
5
1
5
1
5

これは通常行うことではありませんが、シナリオがポップアップする可能性が低い場合は注意が必要です。

于 2011-02-13T02:23:15.407 に答える
8

乱数ジェネレーターを常に再シードしています。プログラムの開始時に1回だけ呼び出しsrand(time(NULL));ます。

于 2011-02-13T02:23:03.083 に答える
0

ランダム関数(言語に関係なく)は部分的にのみランダムです。

すべてのテクノロジーで、同等のものがあります

srand(time(NULL));

このコードは、ランダム関数を開始値にシードし、そこから生成される数値をシードします。これは、常に再シードが同じ値を形成する場合、常に同じ数値を取得することを意味します。

あなたの場合、あなたはこのようなことをしたいです(srand(time(NULL));を一度だけ呼び出す)。

int rolld6 (void) {
    return rand() % 6 + 1;;
}

int main (void) {
    srand (time (NULL));
...
//call your function here
}

同じ値でシードすることの利点の1つは、同じ乱数シーケンスを再生成できることです。

私のゲームの1つでは、オブジェクトをランダムに画面に配置しましたが、再試行オプションも実装したいと思いました。同じ値から再シードするこのオプションを使用すると、すべてのランダムな値を保存せずにやり直すことができます^^

于 2011-02-13T02:41:23.453 に答える