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

Формула для генерации случайных чисел заданного диапазона - C++

06.01.2016, 14:24. Просмотров 609. Ответов 9
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
    
srand(time(NULL));
int massize = 3;
int mas[massize][massize];
for (int i = 0; i < massize; i++)
    {
        for (int b = 0; b < massize; b++)
        {
            mas[i][b] = 10 + rand() % 100;
        }
cout << mas[0][1] << endl;
    }
Должны генерироваться числа от 10 до 100,но генерируются от 10 до 110.Почему так?
http://www.cyberforum.ru/cpp-beginners/thread671763.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2016, 14:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Формула для генерации случайных чисел заданного диапазона (C++):

Средства для генерации случайных чисел
В Си было удобно подключить рандомные числа. через randomize();...

Реализовать алгоритм средних квадратов для генерации случайных чисел
Помогите написать программу: &quot;Реализовать алгоритм средних квадратов для...

Функция генерации случайных чисел
Здравствуйте, возник такой вопрос: мне нужно определить генерацию случайных...

Пару вопрос по генерации случайных чисел.
Здраствуйте уважаемые мастера с++. 1). Мне надо в конструкторе...

Как указать диапазон генерации случайных чисел?
Возник довольно глупый вопрос,как указать диапазон генерации случайных чисел в...

9
_Valera_
489 / 371 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
06.01.2016, 14:26 #2
Цитата Сообщение от G_Man002 Посмотреть сообщение
генерируются от 10 до 110.Почему так?
C++
1
mas[i][b] = 10 + rand() % 90;
по чудным свойствам деления по модулю у нас тут rand() % 100; может получится диапазон чисел от 0 до 100 да плюс еще 10, в итоге от 10 до 110

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
using namespace std;
 
int main()
{
    for(int i=0;i<=200;++i)
        cout<<i%100<<endl;
 
system("PAUSE");
return 0;
}
0
G_Man002
1 / 1 / 1
Регистрация: 24.02.2015
Сообщений: 206
06.01.2016, 14:35  [ТС] #3
по чудным свойствам деления по модулю у нас тут rand() % 100; может получится диапазон чисел от 0 до 100 да плюс еще 10, в итоге от 10 до 110
Но если написать 1 + rand() % 3; ,то будет от 1 до 3,а не 1 до 4.
0
zss
Модератор
Эксперт С++
6952 / 6514 / 4135
Регистрация: 18.12.2011
Сообщений: 17,180
Завершенные тесты: 1
06.01.2016, 14:38 #4
Цитата Сообщение от G_Man002 Посмотреть сообщение
то будет от 1 до 3
так и по формуле
Цитата Сообщение от _Valera_ Посмотреть сообщение
10 + rand() % 90;
будет от 10 до 99, а не до 100
1
_Valera_
489 / 371 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
06.01.2016, 14:48 #5
Цитата Сообщение от zss Посмотреть сообщение
будет от 10 до 99, а не до 100
а я и не говорил что включительно) хотя верно.
0
G_Man002
1 / 1 / 1
Регистрация: 24.02.2015
Сообщений: 206
06.01.2016, 14:52  [ТС] #6
Цитата Сообщение от zss Посмотреть сообщение
будет от 10 до 99, а не до 100
11 + rand() % 100 будет от 11,получается сделать от 10 до 100 нельзя?
0
zss
Модератор
Эксперт С++
6952 / 6514 / 4135
Регистрация: 18.12.2011
Сообщений: 17,180
Завершенные тесты: 1
06.01.2016, 14:58 #7
C++
1
10+rand()%91
Кстати, универсальная формула для действительных чисел от xmin до xmax
C++
1
(double)rand()/RAD_MAX*(xmax-xmin)+xmin
0
G_Man002
1 / 1 / 1
Регистрация: 24.02.2015
Сообщений: 206
06.01.2016, 15:02  [ТС] #8
C++
1
10+rand()%91
только об этом хотел написать,как-то некорректно функция rand() работает,уже 2 раза встречал странные моменты.
0
zss
Модератор
Эксперт С++
6952 / 6514 / 4135
Регистрация: 18.12.2011
Сообщений: 17,180
Завершенные тесты: 1
06.01.2016, 15:29 #9
Цитата Сообщение от G_Man002 Посмотреть сообщение
странные моменты
Странный момент тут один - нарушается равномерность распределения из-за операции получения остатка.
Если равномерность действительно важна, то используйте
C++
1
(int)((double)rand()/RAD_MAX*(xmax-xmin))+xmin
0
GbaLog-
Любитель чаепитий
3156 / 1462 / 462
Регистрация: 24.08.2014
Сообщений: 5,178
Записей в блоге: 1
Завершенные тесты: 2
06.01.2016, 16:10 #10
А можно ещё С++11 воспользоваться.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <random>
#include <ctime>
using namespace std;
...
int main() {
    mt19937 gen( time( nulltpr ) );
    uniform_int_distribution<int> dist( 10, 100 );
    ...
    int massize = 3;
    mas[massize][massize];
    for (int i = 0; i < massize; i++)
    {
        for (int b = 0; b < massize; b++)
        {
            mas[i][b] = dist( gen );
        }
    cout << mas[0][1] << endl;
    }
}
0
06.01.2016, 16:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2016, 16:10
Привет! Вот еще темы с решениями:

Избавиться от первого элемента при генерации случайных чисел
Есть программа, которая генерирует случайные числа для определения вероятности...

Реализовать функцию (или класс) генерации случайных чисел, используя средства из заголовочника random (C++11)
Хотел написать небольшую обертку над stl-вским рандомом. Уж больно он сложный...

Функция, возвращающая х случайных, не равных друг другу, чисел из диапазона от y до z
Нужна функция желательно на разных языках (С, С++, perl, php) которая бы...

Составить функцию, которая возвращает N случайных неповторяющихся целых чисел из диапазона
Помогите плизз Составить функцию, которая возвращает N случайных ...


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

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

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