Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nutius
0 / 0 / 0
Регистрация: 01.06.2011
Сообщений: 60
#1

границы рандомизации - C++

06.02.2013, 01:12. Просмотров 856. Ответов 11
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cout << "Enter a: ";
cin >> a;
cout << "Enter b: ";
cin >> b;
 
 
    cout << "Матрица ДО имеет вид:" << '\n';
    for (int i = 0; i<row; i++)
    {
        for (int j=0;j<col;j++)
        {
             mat[i][j] =  a + rand() % (b - a + 1);
             cout << setw(4) << mat[i][j];
        }
        cout << '\n';
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2013, 01:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос границы рандомизации (C++):

Алгоритмы рандомизации массива - C++
Тут я на днях наткнулся на отличный пост на этом же форуме где обсуждались алгоритмы сортировки массива, я вот про этот пост имею ввиду...

Алгоритм рандомизации поля - C++
Вот я нашел алгоритм, но тупо вставлять в проект я его не хочу, если вам не составит труда помогите понять алгоритм рандомизации. Задача о...

Границы кучи - C++
Как корректно определить границы кучи в любой момент времени без использования функций менеджера дрп в си? Добавлено через 18 часов 7...

Границы массива - C++
Подскажите пожалуйста, что надо изменить в программке, чтобы &quot;Т&quot; не выходила за границы массива. Спасибо! #include &lt;iostream&gt; //...

Границы массива - C++
Пришла ночью дурная идея... как определить конец массива: int main(int argc, char *argv){ int *p, A={1, 2, 3}; p = &amp;A; ...

Задать границы цикла - C++
Всем привет. Как добавить в for такую конструкцию for (k=2; k&lt;=n-1; k++) { или такую while (k&lt;n) или while (k&lt;(n-1)) Чтобы в...

11
Bonaqus
2 / 2 / 0
Регистрация: 10.01.2013
Сообщений: 15
06.02.2013, 01:22 #2
а если так?

C++
1
2
3
randomize();
label:  mat[i][j] = random(b); //генерит число в промежутке [0; b)
if (m[i][j]<a) goto label;
где каждый елемент массива получает рандомное значение.Если значение меньше а, то оно отсеивается.
0
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
06.02.2013, 01:27 #3
C++
1
mat[i][j] = a + rand() % (b - a + 1)
на
C++
1
mat[i][j] = a + (b-a)*rand()/RAND_MAX; //  если a b - вещестаенные
или
C++
1
mat[i][j] = a + (b-a)*1.0*rand()/RAND_MAX; // 1.0f , 1.0L и т.п., если a b - целые
Добавлено через 1 минуту
C++
1
1.0*rand()/RAND_MAX
- переводит число в диапазон 0...1
1
nutius
0 / 0 / 0
Регистрация: 01.06.2011
Сообщений: 60
06.02.2013, 01:35  [ТС] #4
Спасибо, за советы, но не могу понять ,почему выводятся целые числа при рандомизации
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream> 
#include <locale.h>
#include <conio.h>
#include <iomanip>
#include <stdlib.h>
#include <time.h>
 
using namespace std;
int main()
{
    setlocale (0,"rus");
    const int row = 10;
    const int col = 10;
int mat[row][col];
int a, b;
srand(time(NULL));
 
//запрашиваем верхнюю и нижнюю границы рандомизации
cout << "Enter a: ";
cin >> a;
cout << "Enter b: ";
cin >> b;
 
 
    cout << "Матрица ДО имеет вид:" << '\n';
    for (int i = 0; i<row; i++)
    {
        for (int j=0;j<col;j++)
        { 
    
 
mat[i][j] = a + (b-a)*1.0*rand()/RAND_MAX;
             cout << setw(4) << mat[i][j];
        }
        cout << '\n';
    }
}
0
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
06.02.2013, 01:57 #5
в этом:
C++
1
int mat[row][col];
Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
double mat[row][col];
    ....
    cout.precision(3);
    for (int i = 0; i<row; i++) {
        for (int j=0; j<col; j++) {
            mat[i][j] = a + (b-a)*rand()/(1.0*RAND_MAX);
            cout  << setw(6) <<mat[i][j];
        }
        cout << '\n';
    }
1
Bonaqus
2 / 2 / 0
Регистрация: 10.01.2013
Сообщений: 15
08.02.2013, 01:44 #6
Цитата Сообщение от nutius Посмотреть сообщение
Как,запрашивая верхнюю и нижнюю границы рандомизации вывести вещественные числа случайным образом, написала код, но работает неккоректно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cout << "Enter a: ";
cin >> a;
cout << "Enter b: ";
cin >> b;
 
 
    cout << "Матрица ДО имеет вид:" << '\n';
    for (int i = 0; i<row; i++)
    {
        for (int j=0;j<col;j++)
        {
             mat[i][j] =  a + rand() % (b - a + 1);
             cout << setw(4) << mat[i][j];
        }
        cout << '\n';
    }
Стойте, это Visual C++?

rand() % N натолкнуло на мысль...
0
-=ЮрА=-
Заблокирован
Автор FAQ
08.02.2013, 17:20 #7
Цитата Сообщение от nutius Посмотреть сообщение
Как,запрашивая верхнюю и нижнюю границы рандомизации вывести вещественные числа случайным образом
- вот так это можно сделать
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <cmath>
#include <iostream>
using namespace std;
 
int main()
{
    int a = 5;
    int b = 98;
    for(int i = 0; i < 1024; i++)
        cout<<(a + 0.1*(rand() % (10*(b - a))))<<" ";
    return 0;
}
1
Миниатюры
границы рандомизации  
nutius
0 / 0 / 0
Регистрация: 01.06.2011
Сообщений: 60
08.02.2013, 17:31  [ТС] #8
Спасибо, а скажите,зачем знак % нужно использовать при записи функции rand ()?
0
abit
264 / 263 / 33
Регистрация: 03.02.2013
Сообщений: 734
08.02.2013, 17:40 #9
Цитата Сообщение от nutius Посмотреть сообщение
Спасибо, а скажите,зачем знак % нужно использовать при записи функции rand ()?
по умолчанию rand() даёт числа от 0 до RAND_MAX с равновероятным распределением по всему диапазаону,
RAND_MAX это константа, определяет максимально доступное rand число в вашей среде C++, везде разная, но стандарт говорит, что она не может быть меньше 32767

rand()%b - возвращает остаток отделения полученного случайного числа на b тем самым сохраняя равновероятность, но уже в диапазоне [0,b) (правда не совесем сохраняя, полностью сохраняется при кратности RAND_MAX числу b)
0
-=ЮрА=-
Заблокирован
Автор FAQ
08.02.2013, 17:42 #10
Цитата Сообщение от nutius Посмотреть сообщение
Спасибо, а скажите,зачем знак % нужно использовать при записи функции rand ()?
- это остсаток от целочисленного деления, так можно получать число из диапазона после знака процента. Скажем
8 % 3 = 2
5 % 3 = 2
3 % 3 = 0
4 % 3 = 1
видишь числа больше 3-х не возникают
0
abit
264 / 263 / 33
Регистрация: 03.02.2013
Сообщений: 734
08.02.2013, 17:47 #11
православно будет всё же ввести такую функцию

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int nrand(int n)
{
    if (n <= 0 || n > RAND_MAX)
        throw domain_error("Argument to nrand is out of range");
 
    const int bucket_size = RAND_MAX / n;
    int r;
 
    do r = rand() / bucket_size;
    while (r >= n);
 
    return r;
}
и вызывать вместо rand()%b nrand(b)
она точно даст равновероятное распределение в диапазоне [0,n)
0
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
11.02.2013, 10:05 #12
Цитата Сообщение от abit Посмотреть сообщение
православно будет всё же ввести такую функцию

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int nrand(int n)
{
    if (n <= 0 || n > RAND_MAX)
        throw domain_error("Argument to nrand is out of range");
 
    const int bucket_size = RAND_MAX / n;
    int r;
 
    do r = rand() / bucket_size;
    while (r >= n);
 
    return r;
}


и вызывать вместо rand()%b nrand(b)
она точно даст равновероятное распределение в диапазоне [0,n)
А может православней #include <random> и не изобретать велосипед?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2013, 10:05
Привет! Вот еще темы с ответами:

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

Выход за границы массива - C++
Выхожу за пределы массива, но вот только не понимаю как. #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; const...

Границы формирования случайных чисел - C++
Границы формирования случайных чисел и размерность массива задайте без препроцессорных директив помогите решить ...

Проверить на выход за границы массива - C++
ПРивет, помогите пожалуйста, пишу класс - динамический массив, в перегрузке оператора нужно проверить на выход за границы, но не знаю как...


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
11.02.2013, 10:05
Ответ Создать тему
Опции темы

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