0

これが回答済みで、別の言い方をする必要がある場合は、謝罪を開始したいので、見つけることができませんでした。私はこの特定の問題に数時間取り組んできましたが、Google Fu が弱い可能性があります。

私の C++ クラスでは、ユーザーからデータを収集して、数値の桁数と作成するランド数を指定する乱数ジェネレーターを作成する必要があります。ランダムをうまく作成できます。唯一の問題は、数値がどの時点でも複製できないことと、最後に作成した if ループをデクリメントすることで常に true が返され、その理由がわかりません。このため、ループが i のインクリメントに進むことはありません。私が間違っていなければ、最初の試行でエントリが重複することさえあり得ないはずですよね?

void TargetGen::genNumbers()
{
    int mod = 0;
    int baseMod = 0;

    if(Digits != 1)
    {
        baseMod = pow(10.0,(Digits -1));
    }
    mod = (pow(10.0,Digits))-baseMod;


    for(int i=0;i<Numbers;i++)
    {
        cout << "front of i loop, value of i: " << i << endl;
        int randomTemp;

        randomTemp = rand() % mod + baseMod;

        targets[i] = randomTemp;
        cout << "rand: " << targets[i] << endl;
        for(int k = 0;k <= Numbers; k++)
        {
            if(targets[k] == targets[i])
            {
                cout << targets[i] << endl;
                i--;
            }
            cout << " k looping, k value: " << k << endl;
            cout << " k loop, value of i: " << i << endl;

        }
    }
}
4

4 に答える 4

0

どこかで「ターゲット」を初期化しましたか? 私はC ++が少し苦手です(何年もコーディングしていません)が、どこにも宣言されていないので、ターゲットがどこにも初期化されていないため、常にtrueを返していると推測しています...私は間違っているかもしれません。

于 2013-11-07T00:09:00.333 に答える
0

内側のループは、新しいエントリを、それ自体を含む配列内のすべてのエントリと比較しています。k を i 未満に制限すれば問題ありません。

于 2013-11-07T00:13:17.913 に答える
0

いくつか提案があります。

1) 通常、rand() にはシードが必要です。実行するたびに同じ数値が得られる場合は、シードするのを忘れている可能性があります: http://www.cplusplus.com/reference/cstdlib/rand/

2) 生成している乱数を繰り返すことができず、信じられないほど多数の乱数を作成していない場合は、各結果をセットまたはソートされたリストに入れることができます。そうすれば、作成したことがわかっているものと照合することができます。

3) 一般に、N は大文字であるため、数字はクラスを示します。必要に応じて numberOfNumbers を使用してください。より明確な変数名です。

于 2013-11-07T00:19:30.130 に答える
0

コメントから Zac Howland のアドバイスに従い、setベクトルの代わりに a を使用して、サイズをチェックし続けるか、挿入が行われたかどうかを確認することをお勧めします。何かのようなもの:

int insertedNumbers = 0;
set<int> targets;
while (insertedNumbers != Numbers) {
    int randomTemp = rand() % mod + baseMod;

    pair<set<int>::iterator, bool> insertionResult = targets.insert(randomTemp);

    if(insertionResult.second) insertedNumbers ++;
}

cout << "Random numbers:" << targets.size() << endl; // Should equal Numbers
于 2013-11-07T00:15:46.553 に答える