Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 1
Регистрация: 01.06.2011
Сообщений: 60
1

границы рандомизации

06.02.2013, 01:12. Показов 1432. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2013, 01:12
Ответы с готовыми решениями:

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

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

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

Макросы для рандомизации текста
Приведите пожалуйста пример кода для создания пользовательских макросов и простых типа

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
11
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
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
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
0 / 0 / 1
Регистрация: 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
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
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
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
Миниатюры
границы рандомизации  
0 / 0 / 1
Регистрация: 01.06.2011
Сообщений: 60
08.02.2013, 17:31  [ТС] 8
Спасибо, а скажите,зачем знак % нужно использовать при записи функции rand ()?
0
279 / 278 / 83
Регистрация: 03.02.2013
Сообщений: 795
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
279 / 278 / 83
Регистрация: 03.02.2013
Сообщений: 795
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
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2013, 10:05

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Соединить два diva стрелками, чтобы из середины нижней границы стрелка соединялась с серединой верхней границы
Здравствуйте, Подскажите, пожалуйста, как можно соединить два diva стрелками? Чтобы из середины...

Как сделать так, чтобы границы дочерней формы не "уходили" за границы родительской
Всем доброго времени суток! Возник следующий вопрос. Создаю MDI-приложение. Есть родительская форма...

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

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


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

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

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