C ++的随机数的逻辑运算符奇怪的结果(C++ random numbers logical ope

2019-10-17 04:38发布

我试图做一个程序产生的随机数,直到找到一组预定义的数字(例如,如果我有一组我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;
 }

这里是出了可能的结果:

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)的顺序。 这是最好不过我怎么办使循环停止,即使顺序是不一样的,唯一的数字? 感谢您的解答和帮助。

Answer 1:

问题是在你这里的条件:

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


Answer 2:

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

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

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

或将使用德·摩根定律 :

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


文章来源: C++ random numbers logical operator wierd outcome