C++ 如何生成一个介于1和k之间的随机数,该随机数在c++;?

C++ 如何生成一个介于1和k之间的随机数,该随机数在c++;?,c++,math,random,numbers,C++,Math,Random,Numbers,若n=2,m=3,k=5,那个么答案可能是1或4或5。给定的k总是大于或等于3。如果k=3,n=1,m=3,那么答案将是2。假设m≠n、 有四种情况需要考虑: (mk)和(nk): 只需返回一个从1到k的随机数 (一)≤ M≤ k) 和(nk): 生成一个从1到k–1的随机数。如果它等于m,则改为输出k (mk)和(1≤ N≤ k) : 生成一个从1到k–1的随机数。如果它等于n,则改为输出k (一)≤ M≤ k) 及(1)≤ N≤ k) : 生成一个从1到k–2的随机数。如果它等于m,则

若n=2,m=3,k=5,那个么答案可能是1或4或5。给定的k总是大于或等于3。如果k=3,n=1,m=3,那么答案将是2。

假设m≠n、 有四种情况需要考虑:

  • (m<1或m>k)和(n<1或n>k):

    只需返回一个从1到k的随机数

  • (一)≤ M≤ k) 和(n<1或n>k):

    生成一个从1到k–1的随机数。如果它等于m,则改为输出k

  • (m<1或m>k)和(1≤ N≤ k) :

    生成一个从1到k–1的随机数。如果它等于n,则改为输出k

  • (一)≤ M≤ k) 及(1)≤ N≤ k) :

    生成一个从1到k–2的随机数。如果它等于m,则输出k–1,如果它等于n,则输出k

  • 如果m=n,您可以将其中一个设置为零。

    假设m≠n、 有四种情况需要考虑:

  • (m<1或m>k)和(n<1或n>k):

    只需返回一个从1到k的随机数

  • (一)≤ M≤ k) 和(n<1或n>k):

    生成一个从1到k–1的随机数。如果它等于m,则改为输出k

  • (m<1或m>k)和(1≤ N≤ k) :

    生成一个从1到k–1的随机数。如果它等于n,则改为输出k

  • (一)≤ M≤ k) 及(1)≤ N≤ k) :

    生成一个从1到k–2的随机数。如果它等于m,则输出k–1,如果它等于n,则输出k


  • 如果m=n,您可以将其中一个设置为零。

    不考虑长距离的消耗时间,这可以算作一个答案(但不是优化的答案)


    如果不考虑长距离的消耗时间,这可以算作一个答案(但不是最佳答案)

    <>在C++(+)中创建一个随机数的PSUDO集合。因此,我建议使用srand(…)设置种子值。另一个解决方案是:

    int main()
    {
        // Generetes random seed for psudo random numbers.
        srand (1234);
    
        // Initialze variables
        int n, m, k, random;
    
        // Read in values
        std::cout << "Enter n:  ";
        cin >> n;
        std::cout << "Enter m:  ";
        cin >> m;
        std::cout << "Enter k:  ";
        cin >> k;
    
        // Generates a random number
        do {
            random = rand()% k + 1; // Random number from 1 to k
        }
        // Repeat if the random number is equal to n or m
        while (random == n || random == m);
    
        // The value
        cout<<"Number generated: " <<random<<"\n";
    
    
        return 0;
    }
    
    intmain()
    {
    //psudo随机数的Generetes随机种子。
    srand(1234);
    //初始化变量
    int n,m,k,随机;
    //读入值
    std::cout>n;
    std::cout>m;
    std::cout>k;
    //生成一个随机数
    做{
    random=rand()%k+1;//从1到k的随机数
    }
    //如果随机数等于n或m,则重复此操作
    而(random==n | | random==m);
    //价值
    C++中的CUT< P>创建了一个随机数的PSUDO集合。因此,我建议用SRAND(…)设置种子值。
    
    int main()
    {
        // Generetes random seed for psudo random numbers.
        srand (1234);
    
        // Initialze variables
        int n, m, k, random;
    
        // Read in values
        std::cout << "Enter n:  ";
        cin >> n;
        std::cout << "Enter m:  ";
        cin >> m;
        std::cout << "Enter k:  ";
        cin >> k;
    
        // Generates a random number
        do {
            random = rand()% k + 1; // Random number from 1 to k
        }
        // Repeat if the random number is equal to n or m
        while (random == n || random == m);
    
        // The value
        cout<<"Number generated: " <<random<<"\n";
    
    
        return 0;
    }
    
    intmain()
    {
    //psudo随机数的Generetes随机种子。
    srand(1234);
    //初始化变量
    int n,m,k,随机;
    //读入值
    std::cout>n;
    std::cout>m;
    std::cout>k;
    //生成一个随机数
    做{
    random=rand()%k+1;//从1到k的随机数
    }
    //如果随机数等于n或m,则重复此操作
    而(random==n | | random==m);
    //价值
    
    cout有很多方法可以做到这一点,选择取决于底层需求是什么

    // brute force (assumes that n < m):
    int res = rand() % (k - 2) + 1;
    if (n <= res) ++res;
    if (m <= res) ++res;
    
    // elimination:
    int res = rand() % k + 1;
    while (res == n || res == m)
        res = rand() % k;
    
    // table lookup:
    int results[] = { 1, 2, 3, 5, 6, 8 }; // n == 4, m == 7
    int res = rand() % (sizeof results / sizeof *results);
    res = results[res];
    
    //暴力(假设nif(n有很多方法可以做到这一点,选择取决于底层需求是什么

    // brute force (assumes that n < m):
    int res = rand() % (k - 2) + 1;
    if (n <= res) ++res;
    if (m <= res) ++res;
    
    // elimination:
    int res = rand() % k + 1;
    while (res == n || res == m)
        res = rand() % k;
    
    // table lookup:
    int results[] = { 1, 2, 3, 5, 6, 8 }; // n == 4, m == 7
    int res = rand() % (sizeof results / sizeof *results);
    res = results[res];
    
    //暴力(假设n如果(n生成介于1和k-2之间的数字,然后在n之后加1,如果在n和2之后是在m之后,则加1,这样做有助于您:生成介于1和k-2之间的数字,然后在n和2之后是在m之后加1,这样做有助于您:重要的部分是do while循环。前面的代码是just设置。重要的部分是do while循环。前面的代码就是设置。