C++ 根据定义的间隔内的输入生成一个随机数

C++ 根据定义的间隔内的输入生成一个随机数,c++,random,C++,Random,我想生成依赖于用户输入的随机数 例如,如果用户输入8,我想生成从5到7的数字, 8-3至8-1 我的代码: #include <iostream> #include <time.h> int main() { int x1; int x2; std::srand(time(0)); while (true) { std::cout << "input : ";

我想生成依赖于用户输入的随机数

例如,如果用户输入8,我想生成从5到7的数字, 8-3至8-1

我的代码:

#include <iostream>
#include <time.h>

int main()
{

    int x1;
    int x2;

    std::srand(time(0));

    while (true)
    {
        std::cout << "input : ";
        std::cin >> x1;

        x2 = std::rand() % (x1 - 1) + (x1 - 3);

        std::cout << "result : ";
        std::cout << x2 << std::endl;
    }
    return 0;
}
我希望结果是从5到7。

解决您的问题 用这样的表达:

x2 = std::rand() % (x1 - 1) + (x1 - 3); 
使用示例输入,rand%x1-1将是rand%7,这将使您的值从0到6,再加上5,您将得到从5到11的值

如果您坚持使用兰德,您可以使用以下内容:

x2 = rand() / (RAND_MAX / ((x1 - 1) - (x1 - 3) + 1) + 1) + x1 - 3;
时间间隔被修正了,这是一种比使用模更不偏颇的获得随机值的方法,虽然这个问题在使用兰德时永远无法完全解决,但这是一个已知的缺点,还有其他缺点,你可以在网站上找到几个线程,它们提供了关于为什么不应该使用它的可靠推理,比如,例如:

您还可以通过以下机构提供此更具技术性的文件:

在许多其他方面

推荐方法 C++标头提供了更好的随机数生成功能,例如使用和:


使用更现代的方法,您可以使用。对于您当前的解决方案,尝试在纸笔上计算如何使用模和加法将随机值限制在下限和上限之间。提示:现在你的下界是x1-3,上界是2*x1-3。不是我的DV,但可能会有人反对教授使用模运算符将均匀分布随机数源的输出限制在特定的整数范围内。这是众所周知的倒退。这方面的最新技术表现为:Daniel Lemire,间隔内快速随机整数生成。ACM建模与计算机模拟学报,第29卷,第1期,第1-12页@njuffa,是的,可能是这样,我只是同意OP方法,a应该提供一个更坚实的解决方案,并补充说,我想,迟做总比不做好,谢谢你的反馈。与RAND_MAX的业务比一个简单的RAND%3没有任何好处。无论你做什么,结果必然会有轻微的偏差,因为rand的可能值的数量通常不是3的倍数。@TonyK,没错,但错误是一样的,当我们可以使用更好的方法时,使用rand。
x2 = rand() / (RAND_MAX / ((x1 - 1) - (x1 - 3) + 1) + 1) + x1 - 3;
#include <iostream>
#include <random>

int main()
{
    int x1;
    int x2;

    std::random_device rand_d; // random number from hardware
    std::mt19937 generator(rand_d()); // seed
    
    while (true)
    {
        std::cin >> x1;
        std::uniform_int_distribution<> uniform_value(x1 - 3, x1 - 1); // setup the range
        x2 = uniform_value(generator); // generante the value
        std::cout << "result : " << x2 << "\n";
    }
}
x2 = std::rand() % 3 + (x1 - 3);