2012-08-28 60 views
1

我试图做一个程序产生的随机数,直到找到一组预定义的数字(例如,如果我有一组我5个喜爱的数字,多少次,我需要打的让电脑随机找到相同的号码)。我已经写了一个简单的程序,但不明白这似乎是稍稍无关我所期望的结果,例如结局不一定包含所有预定义的数字有时它(甚至不停止循环从运行)。我认为,问题出在逻辑运算符“& &”但我不知道。这里是代码:C++的随机数的逻辑运算符奇怪的结果

const int one = 1; 
const int two = 2; 
const int three = 3; 

using 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 

我也注意到,如果我使用||操盘& &的循环将执行,直到找到确切的数字尊重其中的变量设置(在这里:1,2,3)的顺序。这是更好的,但是我应该怎么做循环停止,即使订单不一样,只有数字?感谢您的回答和帮助。

+0

请编辑这个问题,包括你有更新试图发布为[新问题](http://stackoverflow.com/questions/12182551/negation-before-brackets)。 –

回答

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)) 
+0

感谢您的快速回答。但是,如果你看一下结果,你会看到,即使条件fullfiled它不停止。是的,我已经尝试过||运算符,但如何使循环停止,即使命令不在那里? – user1627930

+0

为任何订单添加了另一种变体检查。 – Mario

+1

宏是邪恶的。 :) – NoSenseEtAl

1

您的逻辑条件的错误:它的意思“而所有的数字不相等”。为了打破这种状况,这是足以让一个对成为相等。

你需要建立一个不同的状态 - 要么把它前面

!(first==one && second==two && third==three) 

“不”或使用De Morgan's law转换:

first!=one || second!=two || third!=three 
+0

是的,你是对的。它会执行,直到一对数字匹配预定义变量 – user1627930

+0

您能解释一下如何使用!在bracketss!(....)前面签名,因为它显示错误。 – user1627930

+0

@ user1627930它不应该是:'!'是一个常规的一元运算符,它可以放在任何表达式前,包括括号中的一个。 – dasblinkenlight