Написал программу в которой пользователь может задать числа А и В.
А - минимальное число.
В - максимальное число.
Т.е. по факту это промежуток чисел,тут же программа должна вывести Х
- случайное число из данного промежутка.
Проблема в том, что компиляторы(пробовал на онлайн и 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 ;
}
a + rand()%(b-a)
При этом вы получаете значения в диапазоне [a,b)
.
Если надо до b
включительно ([a,b]
)-
a + rand()%(b-a+1)
При каждом программы запуске rand()
выдает одну и ту же последовательность случайных чисел. Можете однократно вызвать в начале программы srand(time(0))
- для инициализации ГСЧ значением текущего времени.
Случайные числа в языке программирования С++ могут быть сгенерированы функцией 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 включительно
Вот и все!
С приходом стандарта 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%
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Здравствуй сообщество есть вот такая строка и регулярное выражение:
Использую Selenium, javaЗадача: получить список элементов для двух выпадающих списков и кликнуть на один из полученных элементов в обоих списках