Мне нужно создать пару случайных чисел от 1 до 50. Затем мне нужно, чтобы моя программа генерировала пять других чисел с тем же диапазоном, что и два случайных целых числа. Я знаю, как генерировать первую пару, но Iam не может создать поколение для другого 5. Это, кстати, C++.Случайные числа в диапазоне и совпадающих парах
ответ
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;
}
http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful – Griwes
Предполагая, что я понимаю вашу проблему, для меня работает следующий подход.
Обратите внимание, что 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;
}
Мне нужны 5 номеров с той же разницей, что и r1 и r2 – user2980422
@ user2980422, Хорошо, если я понимаю, что вы хотите, вышеизложенное редактирование работает, проверь его. –
http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful – Griwes
Что-то, как это должно работать:
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 [].
http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful – Griwes
@Griwes Да, ясно, что существуют лучшие генераторы случайных чисел. Однако rand() по-прежнему преподается в классах C-программирования первого года для простоты, а искатель использовал его в своем примере кода. – Patrick
Тот факт, что он все еще учит (или тот факт, что «программирование на первый год C» - это вещь, IDK) абсурдно. И поскольку OP * использовал * rand, не просил об этом, вы можете просто сказать ему, что «ваш путь неправильный, подумайте об этом». Правильный ответ на SO (который на самом деле не предназначен для решения домашних заданий) не должен включать 'rand()'. Даже в пред-11 C++ есть Boost.Random, поэтому всегда есть лучший способ, чем «rand». – Griwes
Для этого решения требуется #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';
}
- 1. случайные биты в целые числа в диапазоне
- 2. Генерировать случайные числа в диапазоне без повторения
- 3. Случайные числа в определенном диапазоне C#
- 4. Как генерировать случайные числа в диапазоне
- 5. Случайные и отрицательные числа
- 6. C# вероятность и случайные числа
- 7. Логарифмические случайные числа в определенном диапазоне в Matlab
- 8. Генерировать случайные числа в определенном диапазоне со стандартным отклонением?
- 9. Нарисуйте случайные числа из распределения в определенном диапазоне
- 10. Javascript: генерировать случайные числа в диапазоне, избегая предыдущих двух
- 11. Мнение и случайные числа
- 12. Случайные числа и getStdGen
- 13. gfortran и случайные числа
- 14. Массивы и случайные числа
- 15. Случайные числа int64 и float64
- 16. Haskell и случайные числа
- 17. Эффективно: случайные числа в фиксированном диапазоне без повторений
- 18. Генерировать поистине случайные числа в диапазоне ячеек с помощью VBA
- 19. выберите случайные числа в определенном диапазоне от вектора
- 20. Эффективно получить случайные числа в диапазоне на GPU
- 21. Случайные числа не случайные?
- 22. Случайные числа JavaScript
- 23. Случайные числа
- 24. Случайные числа Java не случайные?
- 25. Случайные числа в flex
- 26. случайные числа в массив
- 27. Случайные числа в C#
- 28. Случайные числа в Gridview
- 29. Случайные числа в сетке
- 30. Случайные числа в PySpark
У вас есть код для первой части? где вы застряли на второй части? Покажите нам какой-то код. – Caesar
Этот предыдущий поток [Как работает модуль и rand()?] (Http://stackoverflow.com/questions/19553265/how-does-modulus-and-rand-work) охватывает обе опции для C++ и C++ 11 , Сделайте код модульным, и как только вы создадите первый диапазон, используйте тот же код для создания следующего диапазона. В C++ 11 это намного проще. –
возможно дубликат [генерации случайных чисел с плавающей точкой C++] (http://stackoverflow.com/questions/686353/c-random-float-number-generation) –