2

私は自分のCクラス用のゲームを作っています(実際には1つ作り直しています)。ランダムな価格を生成する機能があります。問題は、ゲーム全体でこの関数を60回呼び出す必要があり、関数が呼び出されるたびに番号を新しい番号に再生成する必要があることです。プログラムを終了せずにこれを行うことは可能ですか?もしそうなら、どのように?

これまで、関数のforループを作成しました。しかし、それは私が予想していたのと同じ関数を60回出力するだけです。

コードは次のとおりです。

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

int Prices(void)
{
            //Random price generator
    int Acid = rand() % 10+ 1;
    int Coke = rand() % 150+ 101;
    int Crack = rand() % 30 + 15;
    int Ecstasy = rand() % 8 + 1;
    int Herion = rand() % 100 + 46;
    int Meth = rand() % 100 + 26;
    int Opium = rand() % 65 + 31;
    int Pills = rand() % 7 + 1;
    int Shrooms = rand() % 30 + 16;
    int Speed = rand() % 45 + 11;
    int Weed = rand() % 20 + 21;

    //Prints the above random prices to the main screen
    printf("PRICE PER UNIT:\n\n");  

    printf("Acid: ""%i\n",Acid);

    printf("Coke: ""%i\n",Coke);

    printf("Crack: ""%i\n",Crack);

    printf("Ecstasy: ""%i\n",Ecstasy);

    printf("Herion: ""%i\n",Herion);

    printf("Meth: ""%i\n",Meth);

    printf("Opium ""%i\n",Opium);

    printf("Pills: ""%i\n", Pills);

    printf("Shrooms: ""%i\n", Shrooms);

    printf("Speed: ""%i\n",Speed);

    printf("Weed: ""%i\n",Weed);

    printf("********************************************************************************\n");

    return Acid && Coke && Crack && Ecstasy && Herion && Meth && Opium && Pills && Shrooms && Speed && Weed;
}

int main(void){
    int Prices(void);
    int i;


    for(i=0; i<60; i++){
        Prices();
    }
}

さて、私はsrand関数を削除しましたが、それは機能しましたが、この関数がゲーム全体で定期的に60回だけ呼び出され、一度に呼び出されるように制限する方法も必要です。

4

2 に答える 2

2

自分自身を呼び出さsrandないでください。次の行を削除してください。

srand((unsigned)time(NULL)); //Uses time as seed for random numbers

time()呼び出しの解像度は1秒のみで、ループを実行するたびに1秒もかかりません。その結果、毎回同じ値で乱数ジェネレーターをシードし、同じ乱数セットを生成します

最新rand()の実装では、乱数ジェネレーター自体のシードを処理します。

ほとんどの乱数ジェネレーターは、実際にはシードの決定論的関数でありrand()、これらの1つであるように見えます。この規格rand()は、正当な理由で疑似乱数整数として生成されるものを指します。

于 2011-04-17T04:09:26.880 に答える
0

1つのオプションは、静的変数を使用して、シードがすでに設定されているかどうかを通知することです。このスニペットは、その方法を示しています。

...
static int srand_flag = 0;
if (!srand_flag) {
  srand_flag = 1;
  srand((unsigned)time(NULL));
}
...

time()これにより、シードを1回だけ呼び出すことができるため、ほとんどの実装で提供される1秒の粒度に遭遇することはありません。

もう1つのオプションは、シードの代わりに(通常はプラットフォーム固有の)ミリ秒タイマーを使用することです。ただし、どの関数呼び出しが提供するかは、プラットフォームに大きく依存します。clock_gettime()Linuxでは、たとえば、Windowsでは、おそらく、などをいじくり回す必要がありますGetTickCount()

最後のオプションは、絶対に毎回呼び出す必要がある場合、各呼び出しの前に1秒の遅延を設定して、すべての呼び出しでカウンター値が異なることを確認することです。 (これは良いオプションではありません。)srand()srand()

于 2011-04-17T04:23:42.997 に答える