我试图让程序生成随机数,直到找到一组预定义的数字(例如,如果我有一组我最喜欢的5个数字,我需要多少次才能让计算机随机找到相同的数字)。我编写了一个简单的程序,但不理解结果似乎与我的预期略有不同,例如结果不一定包含所有预定义的数字(有时它确实如此)(甚至不会停止循环从跑步)。我认为问题在于逻辑运算符'&&'但我不确定。这是代码:
const int one = 1;
const int two = 2;
const int three = 3;
使用namespace std;
int main()
{
int first, second, third;
int i = 0;
time_t seconds;
time(&seconds);
srand ((unsigned int) seconds);
do
{
first = rand() % 10 + 1;
second = rand() % 10 + 1;
third = rand() % 10 + 1;
i++;
cout << first<<","<<second<<","<<third<< endl;
cout <<i<<endl;
} while (first != one && second != two && third != three);
return 0;
}
这是可能的结果:
3,10,4
1 // itineration variable
7,10,4
2
4,4,6
3
3,5,6
4
7,1,8
5
5,4,2
6
2,5,7
7
2,4,7
8
8,4,9
9
7,4,4
10
8,6,5
11
3,2,7
12
我也注意到如果我使用||运营商代替&amp;&amp;循环将执行,直到找到关于变量设置顺序的确切数字(此处:1,2,3)。这是更好的但是,即使订单不相同,只有数字,我该怎么做才能使循环停止?感谢您的回答和帮助。
答案 0 :(得分:4)
问题在于你的情况:
} while (first != one && second != two && third != three);
你继续,但没有一个是平等的。但是一旦它们中的至少一个相等,你就会停止/离开循环。
要解决此问题,请使用逻辑或(||
)而不是逻辑和(&&
)来链接测试:
} while (first != one || second != two || third != three);
现在只要其中任何一个不匹配,它就会继续。
编辑 - 进行更高级的比较:
我将使用一个简单的宏来让它更容易阅读:
#define isoneof(x,a,b,c) ((x) == (a) || (x) == (b) || (x) == (c))
请注意,您可以使用不同的方法。
} while(!isoneof(first, one, two, three) || !isoneof(second, one, two, three) || !isoneof(third, one, two, three))
答案 1 :(得分:1)
你的逻辑条件有误:它表示“虽然所有数字都不相等”。为了打破这种情况,一个对就足够了。
你需要构建一个不同的条件 - 要么“不”在它前面
!(first==one && second==two && third==three)
或使用De Morgan's law转换:
first!=one || second!=two || third!=three