-3

我必须生成一对介于 1-50 之间的随机整数。然后我需要让我的程序生成与两个随机整数具有相同范围的其他五个数字。我知道如何生成第一对,但我在为其他 5 个创建生成时遇到了麻烦。顺便说一下,这是 C++。

4

4 回答 4

1

假设我了解您的问题,以下方法对我有用。

请注意,这 5 个数字将具有由 delta 给出的相同绝对差:

int delta = abs(pairOne.x - pairOne.y);

但是您没有提到 x > y 或 y > x 是否是一个约束(一个简单的修改可以启用它)。该代码仅查找具有保证差异 (delta) 的随机数,如下所示。

#include <iostream>
#include <random>

struct RandPair {
    int x;
    int y;
};

int main()
{
    // A Mersenne Twister pseudo-random generator:
    typedef std::mt19937 CppRNG;

    // Seed the generator:
    uint32_t seed_val = 0;
    CppRNG RandomGenerator;
    RandomGenerator.seed(seed_val);

    int min = 1;
    int max = 50;

    std::uniform_int_distribution<uint32_t> uniformMinMax(min, max);

    RandPair pairOne;
    RandPair otherPairs[5];

    pairOne.x = uniformMinMax(RandomGenerator);
    pairOne.y = uniformMinMax(RandomGenerator);

    std::cout << pairOne.x << "; " << pairOne.y << std::endl;

    int delta = abs(pairOne.x - pairOne.y);

    int count = 0;
    while (count < 5) {
        int r1 = uniformMinMax(RandomGenerator);
        int r2 = uniformMinMax(RandomGenerator);
        if ( abs(r1 - r2) == delta && count < 5 ) {
            otherPairs[count].x = r1;
            otherPairs[count].y = r2;
            count++;
        }
    }

    for (int i = 0; i<5; i++) {
        std::cout << "delta: " << delta << "; " << otherPairs[i].x << "; " << otherPairs[i].y << std::endl;
    }

    return 0;
}
于 2013-11-11T19:38:35.390 回答
1

此解决方案需要支持#include <random>C++11 的编译器。

std::random_device rd;
std::mt19937 mt(rd());
std::uniform_int_distribution<int> r1(1, 50);
int first = r1(mt), second = r1(mt);
if (first > second) std::swap(first, second);
std::uniform_int_distribution<int> r2(first, second);
for (int i = 0; i < 5; ++i) {
    std::cout << r2(mt) << '\n';
}
于 2013-11-11T19:57:53.950 回答
-1

像这样的东西应该工作:

void printRandomNumbers( int low, int high )
{
    // Seed the random number generator.
    srand( time(0) )

    // Generate 2 random numbers between low and high (inlcusive).
    int a = ( rand() % ( high-low ) ) + ( low + 1 );
    int b = ( rand() % ( high-low ) ) + ( low + 1 );

    // Find a new low and new high.
    if ( a <= b )
    {
        low = a;
        high = b;
    } else {
        high = a;
        low = b;
    }

    printf("The new low is: %d\nThe new high is: %d\n", low, high);

    // Print 5 numbers inside the new range.
    for ( int i = 0; i < 5; i++ )
    {
        printf( "%d\n", rand() % ( high-low ) + ( low + 1 ) );
    }    
}

int main()
{
    printRandomNumbers(0, 100);
}

如果您不想重复数字,则需要跟踪输出。最简单的方法是使用基本的 c 数组 []。

于 2013-11-11T19:52:03.973 回答
-1
int a, b, low, high;

a = rand()%50 + 1;
b = rand()%50 + 1;

low = min(a,b);
high = max(a,b);

int ar[5];
int range = high-low+1;
for(int i=0; i<5; ++i) {
    ar[i] = rand()%(range) + low;
}
于 2013-11-11T19:31:08.707 回答