Рандомное число в промежутке A и B

182
04 февраля 2019, 03:50

Написал программу в которой пользователь может задать числа А и В.

А - минимальное число.
В - максимальное число.

Т.е. по факту это промежуток чисел,тут же программа должна вывести Х - случайное число из данного промежутка.

Проблема в том, что компиляторы(пробовал на онлайн и CodeBlocks) выдают либо одно и тоже число, либо вообще превышают максимальное число - В.

Я же вводил А = 10,В = 100,получал при каждом повторе - Х = 93,бывало и больше 100. В чём проблема? P.s. оставлю 2 кода

    #include <iostream>
    #include <stdio.h>
    #include <cstdlib>
    using namespace std;
    int main () {
      int x,a,b;
      printf ("Min number:") ;
      cin >> a ;
      printf ("Max number:") ;
      cin >> b ;
      printf ("Random number:") ;
      cout << x + rand() % b +a ;
    }

#include <iostream>
#include <stdio.h>
#include <cstdlib>
using namespace std;
int main () {
  int x,a,b;
  printf ("Min number:") ;
  cin >> a ;
  x = a + rand() % b ;
  printf ("Max number:") ;
  cin >> b ;
  printf ("Random number:") ;
  cout << x ;
}
Answer 1
a + rand()%(b-a)

При этом вы получаете значения в диапазоне [a,b).

Если надо до b включительно ([a,b])-

a + rand()%(b-a+1)

При каждом программы запуске rand() выдает одну и ту же последовательность случайных чисел. Можете однократно вызвать в начале программы srand(time(0)) - для инициализации ГСЧ значением текущего времени.

Answer 2

Случайные числа в языке программирования С++ могут быть сгенерированы функцией rand() из стандартной библиотеки С++. Функция rand() генерирует числа в диапазоне от 0 до RAND_MAX. RAND_MAX — это константа, определённая в библиотеке <cstdlib>. Для MVS RAND_MAX = 32767, но оно может быть и больше, в зависимости от компилятора. Ниже показана простая программка, использующая генератор случайных чисел rand():

// random.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
    cout << "RAND_MAX = " << RAND_MAX << endl; // константа, хранящая максимальный предел из интервала случайных чисел
    cout << "random number = " << rand() << endl; // запуск генератора случайных чисел
    system("pause");
    return 0;
}



Для того чтобы масштабировать интервал генерации чисел нужно воспользоваться, операцией нахождения остатка от деления %.

// пример масштабирования диапазона генерации случайных чисел
rand() % 3 + 1; // диапазон равен от 1 до 3 включительно

В вашем случае это будет:

// пример масштабирования диапазона генерации случайных чисел
a + rand()%(b-a+1); // диапазон равен от a до b включительно

Вот и все!

Answer 3

С приходом стандарта C++11 появился заголовочный файл <random>, позволяющий явно генерировать случайное число из закрытого интервала, причём с равномерным распределением. Используется для этого шаблонный класс std::uniform_int_distribution.

#include <iostream>
#include <chrono>
#include <random>
#include <map>
static std::mt19937_64 gen{
    static_cast<unsigned long long>(
                std::chrono::system_clock::now().time_since_epoch().count())};
void show_stats(std::uniform_int_distribution<int> dis){
    std::map<int, int> counts;
    int testCount = 1000*1000;
    for (int i = 0; i < testCount; i++){
        counts[dis(gen)]++;
    }
    for (const auto& p: counts){
        std::cout << "P(" << p.first << "|" << dis.min() << "," << dis.max() <<")=" << p.second*1.0/(testCount*1.0)*100.0 <<"%" << std::endl;
    }
};
int main()
{
    int A = 1, B = 20;
    std::uniform_int_distribution<int> dis(A,B);
    std::cout << "random number in closed interval [" << A << "," << B << "]:" << dis(gen) << std::endl;
    show_stats(dis);
}

Вывод:

random number in closed interval [1,20]:15
P(1|1,20)=4.9692%
P(2|1,20)=5.0339%
P(3|1,20)=5.0239%
P(4|1,20)=4.9947%
P(5|1,20)=5.0186%
P(6|1,20)=5.0049%
P(7|1,20)=4.9935%
P(8|1,20)=4.975%
P(9|1,20)=5.0004%
P(10|1,20)=4.9836%
P(11|1,20)=5.0179%
P(12|1,20)=4.9781%
P(13|1,20)=5.0065%
P(14|1,20)=4.9524%
P(15|1,20)=4.9968%
P(16|1,20)=5.0168%
P(17|1,20)=5.0158%
P(18|1,20)=5.0075%
P(19|1,20)=4.9998%
P(20|1,20)=5.0107%
READ ALSO
Цикл с локатором

Цикл с локатором

Имею таблицу формата:

245
Регулярное выражение много строчное

Регулярное выражение много строчное

Здравствуй сообщество есть вот такая строка и регулярное выражение:

214
Selenium, Java: выбрать элемент выпадающего списка, если на странице он представлен одновременно select и ul li, и Selenium не видит их оба

Selenium, Java: выбрать элемент выпадающего списка, если на странице он представлен одновременно select и ul li, и Selenium не видит их оба

Использую Selenium, javaЗадача: получить список элементов для двух выпадающих списков и кликнуть на один из полученных элементов в обоих списках

351
extends не работает

extends не работает

Ругается ошибкой на extends, по книжке всё должно работатьВ чём проблема?

275