【问题标题】:C++ random numbers logical operator wierd outcomeC ++随机数逻辑运算符奇怪的结果
【发布时间】:2012-08-22 20:03:27
【问题描述】:

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

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

使用命名空间标准;

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)。这更好,但是即使顺序不同,只有数字,我该怎么做才能使循环停止?感谢您的回答和帮助。

【问题讨论】:

  • 请编辑此问题以包含您尝试以new question 发布的更新。

标签: c++ random numbers operator-keyword logical-operators


【解决方案1】:

问题在于你的情况:

} while (first != one && second != two && third != three);  

当它们都不相等时,您继续。但是一旦其中至少一个相等,您就停止/离开循环。

要解决此问题,请使用逻辑或 (||) 而不是逻辑和 (&amp;&amp;) 来链接测试:

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

【讨论】:

  • 感谢您的快速答复。但是,如果您查看结果,您会发现即使条件已满,它也不会停止。是的,我试过 ||运算符,但是即使订单不存在,如何使循环停止?
  • 为任何订单添加了另一个变体检查。
【解决方案2】:

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

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

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

或使用De Morgan's law进行转换:

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

【讨论】:

  • 是的,你是对的。它一直执行直到一对数字与预定义的变量匹配
  • 您能解释一下如何使用!在括号前签名 !(....) ,因为它显示错误。
  • @user1627930 它不应该是:! 是一个普通的一元运算符,它可以放在任何表达式的前面,包括带括号的表达式。
猜你喜欢
  • 2012-05-03
  • 2020-04-09
  • 1970-01-01
  • 2019-09-06
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
相关资源
最近更新 更多