2013-11-11 2 views
-3

Мне нужно создать пару случайных чисел от 1 до 50. Затем мне нужно, чтобы моя программа генерировала пять других чисел с тем же диапазоном, что и два случайных целых числа. Я знаю, как генерировать первую пару, но Iam не может создать поколение для другого 5. Это, кстати, C++.Случайные числа в диапазоне и совпадающих парах

+0

У вас есть код для первой части? где вы застряли на второй части? Покажите нам какой-то код. – Caesar

+1

Этот предыдущий поток [Как работает модуль и rand()?] (Http://stackoverflow.com/questions/19553265/how-does-modulus-and-rand-work) охватывает обе опции для C++ и C++ 11 , Сделайте код модульным, и как только вы создадите первый диапазон, используйте тот же код для создания следующего диапазона. В C++ 11 это намного проще. –

+0

возможно дубликат [генерации случайных чисел с плавающей точкой C++] (http://stackoverflow.com/questions/686353/c-random-float-number-generation) –

ответ

-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; 
} 
+0

http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful – Griwes

1

Предполагая, что я понимаю вашу проблему, для меня работает следующий подход.

Обратите внимание, что 5 числа будет иметь ту же абсолютную разницу дается дельта:

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

но вы не упомянули ли или нет х> у или у> х было ограничение (простая модификация может включите это). Код просто находит случайные числа с гарантированной разницей (дельта), как показано ниже.

#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; 
} 
+0

Мне нужны 5 номеров с той же разницей, что и r1 и r2 – user2980422

+0

@ user2980422, Хорошо, если я понимаю, что вы хотите, вышеизложенное редактирование работает, проверь его. –

+0

http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful – Griwes

-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 [].

+0

http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful – Griwes

+0

@Griwes Да, ясно, что существуют лучшие генераторы случайных чисел. Однако rand() по-прежнему преподается в классах C-программирования первого года для простоты, а искатель использовал его в своем примере кода. – Patrick

+0

Тот факт, что он все еще учит (или тот факт, что «программирование на первый год C» - это вещь, IDK) абсурдно. И поскольку OP * использовал * rand, не просил об этом, вы можете просто сказать ему, что «ваш путь неправильный, подумайте об этом». Правильный ответ на SO (который на самом деле не предназначен для решения домашних заданий) не должен включать 'rand()'. Даже в пред-11 C++ есть Boost.Random, поэтому всегда есть лучший способ, чем «rand». – Griwes

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'; 
} 
Смежные вопросы