2

私のコードは、ランダムな名前へのポインターを初期化します。ランダムな名前は、rand 関数を使用してランダムに選択されます。

rand 関数が、私がやりたいことを完全に実行していないことに気付きました。次のコードでは、すべてのポインターを同じ名前で初期化します! これは、時間関数に基づいて選択する rand 関数に関係していると思われます。一度にすべてのポインタを初期化すると、同じ乱数が生成されます!? タイムスタンプが別の番号を生成するのに時間がかかるはずですよね? ループで初期化を実行することでコードを修正できますが、ループを処理するのに数秒かかる場合があるため、修正する別の方法を知りたいです。

参考のため:

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

int  random_number(int, int);
const char *random_name();
//----------------------------------------------------------------
int main(void)
{
    const char * kg = NULL;
    const char * ke = NULL;
    const char * dg = NULL;
    const char * de = NULL;

    kg = random_name();
    ke = random_name();
    dg = random_name();
    de = random_name();

    printf("kg=%s\nke=%s\ndg=%s\nde=%s\n", kg, ke, dg, de);

    return 0;
}
//----------------------------------------------------------------
const char *random_name(int x)
{
    const char *names[7] =
    {"Bob", "Billy", "Buck", "Bobby", "Bill", "Billy Bob", "Bobi"};

    int roll = random_number(0,7);
    return names[roll];
}
//----------------------------------------------------------------
int random_number(int min, int max)
{
    int roll;
    int maximum = max - min;
    srand(time(NULL));
    roll = (rand() % maximum) + min;
    return roll;
}
4

4 に答える 4

7

このrand()関数は、前の世代を使用して次の値を計算する疑似乱数ジェネレーターです。シードするsrand()ことにより、開始値を設定し、複数回行うと、乱数シーケンスを効果的に「リセット」します。srand()の各呼び出しの前ではなく、プログラムの開始時に乱数ジェネレーターを 1 回 (を使用して) シードしますrand()

于 2013-06-19T01:06:23.843 に答える
2

プログラムは非常に高速に実行されるためtime、呼び出されるたびに同じ値が返されます。srand( s「シード」の略) に渡される値randによって生成されるシーケンスが決定されるため、同じプログラム実行内で毎回同じ数 (最初の数またはそれ以外の場合はランダムなシーケンス) が生成されます。 1 秒後にプログラムを再度実行します。

解決策は、他の人が述べたように、代わりにsrandの先頭で呼び出すことです。main

于 2013-06-19T01:19:11.723 に答える
2

srand(time(NULL))メインメソッドに移動します。これにより、プログラムのエントリ ポイントで乱数ジェネレーターがシードされ、rand()呼び出されるたびに残りの部分から均等に分散された異なる乱数を取得できるようになります。

于 2013-06-19T01:06:42.757 に答える
2

問題は、実行ごとに新しい値を使用して PRNG への各呼び出しをシードするという事実にあると思います。srand()ここで何をするか見てください。rand()各呼び出しで PRNG をシードしないようにする理由は、次の呼び出しで生成される値が均等に分散されることを保証できないためです。あなたが探している可能性が最も高いのは、値の均一な分布でありsrand()、この方法で使用すると予期しない結果が生じることです。この回答では、一度だけ電話する必要がある理由について詳しく説明しますsrand()

また、C だけでなく、どの言語の PRNG にも同様のルールが適用されることに注意してください。

于 2013-06-19T01:06:45.040 に答える