0

如果这个问题已经得到回答,只是想开始道歉,只是应该用不同的措辞,所以我找不到它。我已经在这个特殊问题上工作了几个小时,我的 Google Fu 的 atm 可能很弱。

对于我的 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

内部循环将新条目与数组中的所有条目(包括其自身)进行比较。限制 k 小于 i,你应该没问题。

于 2013-11-07T00:13:17.913 回答
0

我建议您从评论中遵循 Zac Howland 的建议,使用 aset而不是向量并继续检查大小,或者更确切地说是否发生了插入。就像是:

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 回答
0

我有几个建议给你:

1) rand() 通常需要播种。如果每次运行它都会得到相同的数字,那么您可能忘记播种: http ://www.cplusplus.com/reference/cstdlib/rand/

2) 如果您无法重复生成的随机数,并且您没有创建大量的随机数,您可能希望将每个结果放入一个集合或排序列表中。这样,您就可以检查您所知道的已创建的内容。

3) 通常数字表示一个类别,因为 N 是大写的。如果必须使用 numberOfNumbers,它是一个更清晰的变量名称。

于 2013-11-07T00:19:30.130 回答
0

您是否在任何地方初始化了“目标”?我在 C++ 方面有点弱(我已经很多年没有编码了),但我没有看到它在任何地方声明......所以我猜它总是返回 true,因为目标没有在任何地方初始化......我可能是错的。

于 2013-11-07T00:09:00.333 回答