Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Timurcpp
0 / 0 / 0
Регистрация: 01.03.2014
Сообщений: 36
#1

Как работает генерация случайных чисел в приведенном коде - C++

30.03.2014, 08:54. Просмотров 367. Ответов 9
Метки нет (Все метки)

Дорогие Форумчане!

Подскажите пожалуйста, как работает нижеследующий код для генерации случайных чисел:

C++
1
random=rand()%(b+1-a)+a;
Не могли бы объяснить, почему (Б плюс 1, а потом минус А) и плюс А. Как выбирается диапазон между А и Б?

Ниже приведен пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <clocale>
#include <cstdlib>
#include <ctime>
using namespace std;
    void main()
    {
    setlocale (LC_CTYPE,"rus");
    srand(time(NULL));
    int random,a, b;
    cout<<"Введите диапазон от и до ";
    cin>>a>>b;
    random=rand()%(b+1-a)+a;
    cout<<"Случайное число = "<<random<<endl;
    }
Заранее благодарю
http://www.cyberforum.ru/cpp-beginners/thread1082136.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2014, 08:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как работает генерация случайных чисел в приведенном коде (C++):

Не работает сортировка в приведенном коде
что тут не так? #include &lt;iostream&gt; using namespace std; void en(int*...

Как работает функция "test" в приведенном коде
Объясните как работает функция test #include &lt;conio.h&gt; #include...

Каким образом работает swap в приведенном коде?
Каким образом работает swap в коде ниже? #include&lt;list&gt; #include&lt;memory&gt;...

Генерация случайных чисел
Доброго времени суток ! Как генерировать случайное число например в диапазоне...

Генерация случайных чисел
Мне нужно заполнить множество матриц числами 0 или 1. Для этого использую...

9
Winorun
39 / 39 / 8
Регистрация: 03.05.2013
Сообщений: 178
30.03.2014, 09:15 #2
b+1-a - это диапазон т.е. получаем порядковый номер числа добавляем к нему а и получаем число от а до б

Добавлено через 3 минуты
пример а=50 б=100
б-а+1 = 51
берем остаток от ранд получаем число от 0 до 51
добавляем а диапазон становится 50 - 100
1
Timurcpp
0 / 0 / 0
Регистрация: 01.03.2014
Сообщений: 36
30.03.2014, 10:57  [ТС] #3
Цитата Сообщение от Winorun Посмотреть сообщение
b+1-a - это диапазон т.е. получаем порядковый номер числа добавляем к нему а и получаем число от а до б

Добавлено через 3 минуты
пример а=50 б=100
б-а+1 = 51
берем остаток от ранд получаем число от 0 до 51
добавляем а диапазон становится 50 - 100
Спасибо за ваш ответ, но я чуточку не могу понять, если:

(b-a+1) + а, когда: a=50, b=100

Значит: (100-50+1) + 50

т.е. 51+50

Подскажите, где именно выражен диапазон между 100 и 50? я вижу только 51 и 50.

0
dimcoder
Полярный
467 / 440 / 157
Регистрация: 11.09.2011
Сообщений: 1,142
30.03.2014, 11:11 #4
Лучший ответ Сообщение было отмечено Timurcpp как решение

Решение

Цитата Сообщение от Timurcpp Посмотреть сообщение
Значит: (100-50+1) + 50
т.е. 51+50
Цитата Сообщение от Timurcpp Посмотреть сообщение
rand()%(b+1-a)+a;
так точнее
Вот пример с
Цитата Сообщение от Timurcpp Посмотреть сообщение
a=50, b=100
1)rand()%(b+1-a) ---> rand()%(100+1-50) ---> rand()%(51) ----> получаем число от 0 до 51, т.к. % - это остаток от деления. Допустим 186%51 = 33.
2) (0---51) + 50 ----> (50---101)
1
ValeryS
Модератор
7127 / 5395 / 669
Регистрация: 14.02.2011
Сообщений: 18,212
30.03.2014, 11:23 #5
Timurcpp,
а ты сам посчитай тогда поймешь
нужно сгенерировать числа допустим от 100(a) до 200(b)
значит минимальное значение мы знаем это 100
теперь диапазон начиная с нуля, потому что минимальное число rand дает 0
диапазон будет 100 200-100
но чтобы получить числа от 0 до 100 нужно разделить на 101,максимальный остаток при делении на 101 будет 100

и в результате диапазон считается 200-100+1
C++
1
random=rand()%(b+1-a)+a;
1 rand() гененерит число
2 %(b+1-a) загоняем число в диапазон,остаток от деления на диапазон плюс 1
3 +a; добавляем минимальное значение
0
zss
Модератор
Эксперт С++
6953 / 6515 / 4136
Регистрация: 18.12.2011
Сообщений: 17,193
Завершенные тесты: 1
30.03.2014, 12:02 #6
Если делать в соответствии с рекомендациями, то формула должна быть такая
C++
1
double random=rand()/(double)RAND_MAX*(Max-Min)+Min;
Max, Min - интервал в котором надо получить число,
RAND_MAX - константа определенная в math.h
0
ValeryS
Модератор
7127 / 5395 / 669
Регистрация: 14.02.2011
Сообщений: 18,212
30.03.2014, 12:23 #7
zss,
эта тема была актуальна лет пятнадцать назад
спорили до хрипоты, что лучше остаток от деления или деление на полный диапазон
вроде бы
C++
1
random=rand()/(double)RAND_MAX*(Max-Min)+Min;
дает лучшее распределение, по сравнению с
C++
1
random=rand()%(Max+1-Min)+Min;
но доказательства не помню
0
zss
Модератор
Эксперт С++
6953 / 6515 / 4136
Регистрация: 18.12.2011
Сообщений: 17,193
Завершенные тесты: 1
30.03.2014, 12:43 #8
Цитата Сообщение от ValeryS Посмотреть сообщение
дает лучшее распределение
Не меняется равномерность распределения.
А с операцией % распределение может быть очень причудливым.
0
ValeryS
Модератор
7127 / 5395 / 669
Регистрация: 14.02.2011
Сообщений: 18,212
30.03.2014, 13:02 #9
вот допустим дает генератор числа от 0 до 10(включительно)
а нам нужно три значения 0 1 2
x%3
сгененирует
0 1 2 0 1 2 0 1 2 0 1
вероятность выпадения двойки меньше
теперь
x/11 *3

0.0 0.27 0.54 0.81 1.09 1.36 1.63 1.9 2.18 2.45 2.72
приводим к целому
0 0 0 0 1 1 1 1 2 2 2
опять вероятность двойки меньше
или я не про то?
0
zss
Модератор
Эксперт С++
6953 / 6515 / 4136
Регистрация: 18.12.2011
Сообщений: 17,193
Завершенные тесты: 1
30.03.2014, 13:15 #10
Цитата Сообщение от ValeryS Посмотреть сообщение
приводим к целому
Приведение к целому тоже исказит равномерность распределения.
Но проверять ее надо не на таких маленьких выборках,
а на таких, которые содержат как минимум 10000 испытаний.
0
30.03.2014, 13:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2014, 13:15
Привет! Вот еще темы с решениями:

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

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

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

Генерация случайных чисел
Вопрос такой: возможно ли при помощи функции random, устроить случайную...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru