0

私は、銃の全体的な品質に影響を与えるランダムなコンポーネントを備えたショットガンを生成するマシンを作成しています。ショットガンを構成するランダムパーツの生成に問題があります。生成する必要がある4つの部分があります。これらの各関数を作成したとき、それらを個別にテストしてすべて機能しましたが、関数と一緒に組み合わせようとするとcreateChromo()、数値は個別にランダムになります。2131や1332のような結果が得られるはずですが、1111、1112、2221、2222のようになり続けます。コードは次のとおりです。

int generateButt()
{
    srand(unsigned(time(NULL)));
    int buttType = rand() % 3 + 1;

    if(buttType == 1)
    {
         accuracy = rand() % ((5 - 2) + 2) / 10.0;

         fireRate = fireRate - 0.3;
    }
    if(buttType == 2)
    {
        accuracy = rand() % ((8 + 5) + 5)/ 10.0;

        fireRate = fireRate - 0.2;
    }
    if(buttType == 3)
    {
        accuracy = rand() % ((11 + 8) + 8) / 10.0;

        fireRate = fireRate - 0.1;
    }

    return buttType;
}
int generateBarrel()
{
    srand(unsigned(time(NULL)));
    int barrelType = rand() % 3 + 1;

    if(barrelType == 1)
    {
        range = rand() % (16 - 5) + 5;

        power = power + 3;
    }
    if(barrelType == 2)
    {
        range = rand() % (21 - 16) + 16;

        power = power + 1;
    }
    if(barrelType == 3)
    {
        range = rand() % (26 + 21) + 21;

        power = power - 1;
    }

    return barrelType;
}
int generateBullet()
{
    srand(unsigned(time(NULL)));
    int bulletType = rand() % 3 + 1;

    if(bulletType == 1)
    {
        power = rand() % (16 - 10) + 10;

        range = range + 5;
    }
    if(bulletType == 2)
    {
        power = rand() % (26 - 16) + 16;

        range = range + 1;
    }
    if(bulletType == 3)
    {
        power = rand() % (35 - 26) + 26;

        range = range - 2;
    }

    return bulletType;
}
int generateAction()
{
    srand(unsigned(time(NULL)));
    int actionType = rand() % 2 + 1;

    if(actionType == 1)
    {
        fireRate = 1.5;

        accuracy = accuracy + 0.2;
    }
    if(actionType == 2)
    {
        fireRate = 2.0;

        accuracy = accuracy - 0.1;
    }

    return actionType;
}

void createChromo(int a, int b, int c, int d)
{
    cout <<a<<b<<c<<d<<"\n";
}

int main()
{
        for(int i = 0; i < popSize; i++)
        createChromo(generateButt(), generateBarrel(), generateBullet(), generateAction());
    system("pause");
    return 0;
}
4

2 に答える 2

4

いずれかの関数を呼び出すsrandたびに呼び出しています。srand乱数の新しい文字列のジェネレータをシードします。そのシードは現在の秒に基づいているため、同じ秒で呼び出された場合、シードは前回と同じになり、から取得される乱数のシーケンスrand()も同様になります。

プログラムの最初に1回呼び出しsrand(time(NULL));て、1つのシーケンスだけを作成し、同じシーケンスを最初からやり直すのではなく、その1つのシーケンスの次の番号を使い続けます。

C ++ 11にアクセスできる場合は、<random>ヘッダーの使用も検討してください。

于 2012-09-26T02:44:49.347 に答える
1
  1. ランダムの概念は、計算の世界全体には存在しません
  2. 関数は、関数のsrand()シードを設定するために使用されますrand()
  3. 2つの異なるシードを設定すると、疑似乱数のジェネレーターは2つの異なる方法で動作します
于 2012-09-26T02:43:59.977 に答える