C++ C++;随机数逻辑运算符wierd结果

C++ C++;随机数逻辑运算符wierd结果,c++,random,numbers,operator-keyword,logical-operators,C++,Random,Numbers,Operator Keyword,Logical Operators,我正在尝试制作一个生成随机数的程序,直到它找到一组预定义的数字(例如,如果我有一组我最喜欢的5个数字,我需要玩多少次才能让计算机随机找到相同的数字)。我写了一个简单的程序,但不理解结果,它似乎与我的预期略有无关,例如,结果不一定包含所有预定义的数字,有时它确实包含(即使这样也不会阻止循环运行)。我认为问题在于逻辑运算符“&&”,但我不确定。代码如下: const int one = 1; const int two = 2; const int three = 3; 使用名称空间std int

我正在尝试制作一个生成随机数的程序,直到它找到一组预定义的数字(例如,如果我有一组我最喜欢的5个数字,我需要玩多少次才能让计算机随机找到相同的数字)。我写了一个简单的程序,但不理解结果,它似乎与我的预期略有无关,例如,结果不一定包含所有预定义的数字,有时它确实包含(即使这样也不会阻止循环运行)。我认为问题在于逻辑运算符“&&”,但我不确定。代码如下:

const int one = 1;
const int two = 2;
const int three = 3;
使用名称空间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;
 }

我还注意到,如果我使用| |操作符而不是&&循环将一直执行,直到找到与变量设置顺序有关的确切数字(这里是:1,2,3)。这是更好的,但我应该怎么做,使循环停止,即使顺序不一样,只有数字?谢谢你的回答和帮助

问题就在你的情况下:

} while (first != one && second != two && third != three);  
当他们都不平等时,你继续。但一旦其中至少有一个相等,就停止/离开循环

要解决此问题,请使用逻辑or(
|
)而不是逻辑and(
&&
)链接测试:

} 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))

问题在于您的情况:

} while (first != one && second != two && third != three);  
当他们都不平等时,你继续。但一旦其中至少有一个相等,就停止/离开循环

要解决此问题,请使用逻辑or(
|
)而不是逻辑and(
&&
)链接测试:

} 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))

你的逻辑条件有一个错误:它的意思是“所有的数字都不相等”。要打破此条件,一对相等就足够了

你需要构造一个不同的条件——要么在它前面加上“not”

!(first==one && second==two && third==three)
或使用以下方式转换:


你的逻辑条件有一个错误:它的意思是“所有的数字都不相等”。要打破此条件,一对相等就足够了

你需要构造一个不同的条件——要么在它前面加上“not”

!(first==one && second==two && third==three)
或使用以下方式转换:


谢谢你快速的回答。然而,如果你观察结果,你会发现即使条件已满,它也不会停止。是的,我尝试了| |运算符,但是如何使循环停止,即使没有订单?添加了另一个变体检查任何订单。感谢您的快速回答。然而,如果你观察结果,你会发现即使条件已满,它也不会停止。是的,我尝试了| |运算符,但如何使循环停止,即使订单不存在?添加了另一个变体检查任何订单。是的,你是对的。它将一直执行,直到一对数字与预定义变量匹配。请解释如何使用!在支架前签名!(..),因为它显示了一个错误。@user1627930它不应该:
是一个常规的一元运算符,它可以位于任何表达式的前面,包括括号内的表达式。是的,您的回答是正确的。它将一直执行,直到一对数字与预定义变量匹配。请解释如何使用!在支架前签名!(..),因为它显示了一个错误。@user1627930它不应该:
是一个常规的一元运算符,它可以位于任何表达式的前面,包括括号内的表达式。请编辑此问题以包含您试图作为发布的更新。请编辑此问题以包含您试图作为发布的更新。