C++ 生成具有特定规则的两个随机数

C++ 生成具有特定规则的两个随机数,c++,random,C++,Random,我正在编写一个代码,生成两个随机整数,并显示第一个数除以第二个数的结果。 我希望第一个整数大于第二个整数,不带余数的除法结果是一个整数 我尝试使用do-while循环并继续更改整数,直到它生成我想要的数字 std::random_device device; std::mt19937 rd(device()); std::uniform_int_distribution<int> random(1, 100); int firstNumber; int secondNumber;

我正在编写一个代码,生成两个随机整数,并显示第一个数除以第二个数的结果。 我希望第一个整数大于第二个整数,不带余数的除法结果是一个整数

我尝试使用do-while循环并继续更改整数,直到它生成我想要的数字

std::random_device device;
std::mt19937 rd(device());
std::uniform_int_distribution<int> random(1, 100);

int firstNumber;
int secondNumber;

do
{
    firstNumber = random(rd);
    secondNumber = random(rd);
}
while ((firstNumber < secondNumber) && (firstNumber % secondNumber != 0));

int result = firstNumber / secondNumber;

//print the integer to check it
std::cout << firstNumber << std::endl; 
std::cout << secondNumber << std::endl;

每次我运行这段代码时,第一个整数总是比第二个整数多。但是除法结果将是余数

您的条件检查中有一些错误。但另一种方法是根据第二个数字绘制的结果生成第一个数字:

std::uniform_int_distribution<int> random(1, 50);
secondNumber = random(rd);
{
    std::uniform_int_distribution<int> random(2, 100 / secondNumber);
    firstNumber = random(rd) * secondNumber;
}

这消除了条件检查的需要。

条件检查中有一些错误。但另一种方法是根据第二个数字绘制的结果生成第一个数字:

std::uniform_int_distribution<int> random(1, 50);
secondNumber = random(rd);
{
    std::uniform_int_distribution<int> random(2, 100 / secondNumber);
    firstNumber = random(rd) * secondNumber;
}

这样就不需要进行条件检查。

您的循环检查是错误的!试试这个

do
{
    firstNumber = random(rd);
    secondNumber = random(rd);
} while ((firstNumber <= secondNumber) || (firstNumber % secondNumber != 0));
您需要一直运行循环,直到两个条件都满足,因此如果其中一个或另一个不满足,请继续尝试


另外,如果你有你的循环检查是错误的!试试这个

do
{
    firstNumber = random(rd);
    secondNumber = random(rd);
} while ((firstNumber <= secondNumber) || (firstNumber % secondNumber != 0));
您需要一直运行循环,直到两个条件都满足,因此如果其中一个或另一个不满足,请继续尝试

还有,如果你有 随机选取第一个数字:num1

随机选择第二个大于1的数字:num2

较大的数字是num1*num2。较小的数字是num1。除法的结果是num2

随机选取第一个数字:num1

随机选择第二个大于1的数字:num2

较大的数字是num1*num2。较小的数字是num1。除法的结果是num2


您可以使用两种分布:一种是在生成第一个数字后创建的,并且第一个数字减去1作为上限。那么你就不需要为那个部分创建循环了。如果条件为false,while循环就会停止。如果firstNumber>=secondNumber或余数为零,则条件为false!a&&b=!a | | |!b在你的情况下更换操作员大约一个小时!a | | b=!a&&!b、 当然,构造条件要比期望两个随机数遵守它更容易:secondNumber=randomrd;firstNumber=secondNumber*randomrd.@Someprogrammerdude是的,但是第一个发行版应该是2100,而不是1100。否则,您将面临第一个随机数滚动1,然后第二个分布变为1,0的风险,这是错误的。第一个数字=5第二个数字=3:5<3&&5%3!=0==false&&true==false。您希望这两个条件都为false。您可以使用两个分布:一个是在生成第一个数字后创建的,并且第一个数字减去1作为上限。那么你就不需要为那个部分创建循环了。如果条件为false,while循环就会停止。如果firstNumber>=secondNumber或余数为零,则条件为false!a&&b=!a | | |!b在你的情况下更换操作员大约一个小时!a | | b=!a&&!b、 当然,构造条件要比期望两个随机数遵守它更容易:secondNumber=randomrd;firstNumber=secondNumber*randomrd.@Someprogrammerdude是的,但是第一个发行版应该是2100,而不是1100。否则,您将面临第一个随机数滚动1,然后第二个分布变为1,0的风险,这是错误的。第一个数字=5第二个数字=3:5<3&&5%3!=0==false&&true==false。您希望这两个条件都为false。