只是想开始道歉,如果这已被回答,并且应该措辞不同,所以我无法找到它。我一直在研究这个特殊问题几个小时,而且我的Google Fu可能很弱。
对于我的c ++类,我必须创建一个随机数生成器,它从用户收集数据以指定数字必须的位数和要创建的rands数。我可以很好地创建randoms,唯一的问题是数字在任何时候都不能复制,我在最后创建的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;
}
}
}
答案 0 :(得分:0)
你有没有在任何地方初始化“目标”?我在c ++方面有点弱(我多年没有用它编写代码),但我没有看到它在任何地方声明...所以我猜它总是返回true,因为目标没有在任何地方初始化......我可能错了。
答案 1 :(得分:0)
内部循环将新条目与数组中的所有条目进行比较,包括自身。限制k小于i,你应该没事。
答案 2 :(得分:0)
我建议你从评论中遵循Zac Howland的建议,使用set
代替向量并继续检查大小,或者更确切地说是否插入了。类似的东西:
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
答案 3 :(得分:0)
我有几点建议:
1)rand()通常需要播种。如果你每次运行它都得到相同的数字,你可能忘了播种: http://www.cplusplus.com/reference/cstdlib/rand/
2)如果您无法重复生成的随机数,并且您没有创建大量的随机数,则可能需要将每个结果放入集合或排序列表中。这样你就可以检查你所知道的内容。
3)通常数字表示一个类,因为N是大写的。如果必须,请使用numberOfNumbers,这是一个更清晰的变量名称。