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

Коряво работает сброс рандома - C++

Восстановить пароль Регистрация
 
Frip
1 / 1 / 1
Регистрация: 04.11.2013
Сообщений: 257
09.10.2015, 19:13     Коряво работает сброс рандома #1
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <ctime>
#include <cstdlib>
 
using namespace std;
 
//функция модуль
double aabs(double a, double b){
    double c;
    c = a - b;
    if (c<0){ 
        c = c * (-1); 
    }
    return c;
}
 
//функция случайного числа в диапазоне от a до b
inline int random_ab(double a, double
 b)
    {
        return(double)(a + (b - a)*(((double)rand()) / (double)(RAND_MAX + 1)));
    }
 
 
int main(){
    setlocale(LC_ALL, "Russian");
 
    srand(time(NULL));
 
 
    //объявление массива лифтов и их заполненности
    double lifts[2][3];
 
    //цикл заполнения позиции лифтов и их заполненности
    for (int ii = 0; ii <= 2 ; ii++){
        lifts[0][ii] = random_ab(1, 40); // позиция лифта
        lifts[1][ii] = random_ab(0, 1);  // заполненность (0 - пустой, 1 - заполнен)
    }
 
    double poz;
    cout << "Введите номер этажа, где находится человек: ";
    cin >> poz;
    cout << endl;
 
    //печать позий лифтов и их заполненности
    for (int j = 0; j <= 2; j++){
        cout << j + 1 << "-ый лифт находится на " << lifts[0][j] << " этаже и он ";
        if (lifts[1][j] == 1) {
            cout << "заполнен";
        }
        else{
            cout << "пустой";
        }
        cout << endl;
    }
    
    system("pause");
}
Есть программа, она выставляет случайные значение позиций 3 лифтов.

17 - 22: функция рандома из диапазона чисел, препод дал эту функцию, мол работает нормально.

В чем суть проблемы: неверно сбрасывает рандом. Допустим в первый запуск были 3 числа (4, 7, 24), то в следующий, 1 число опять остается 4, а другие уже становятся другими. И заполненность всегда равна 0 (37 строка), сколько бы не делал, всегда значение = 0 (т.е. лифт пустой)

Подскажите как решить проблему. Заранее Спасибо!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2015, 19:13     Коряво работает сброс рандома
Посмотрите здесь:

C++ функции .. вроде как то коряво
Скорость рандома C++
C++ if/else if коряво работает
C++ Работа с двумерной матрицей (верхний предел рандома)
C++ Генератор рандома
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,579
09.10.2015, 19:36     Коряво работает сброс рандома #2
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <ctime>
#include <cstdlib>
 
using namespace std;
 
//функция модуль
double aabs(double a, double b){
    double c;
    c = a - b;
    if (c<0){ 
        c = c * (-1); 
    }
    return c;
}
 
//функция случайного числа в диапазоне от a до b
inline int random_ab(double a, double b)
    {
        return a + (b - a) * ((double)rand() / (double)RAND_MAX);
    }
 
//функция случайного числа в диапазоне от 0 до 1
inline int random_01()
    {
        return rand() < RAND_MAX / 2 ? 0 : 1;
    }
 
 
int main(){
    setlocale(LC_ALL, "Russian");
 
    srand(time(NULL));
 
 
    //объявление массива лифтов и их заполненности
    int lifts[2][3];
 
    //цикл заполнения позиции лифтов и их заполненности
    for (int ii = 0; ii < 3 ; ii++){
        lifts[0][ii] = random_ab(1, 40); // позиция лифта
        lifts[1][ii] = random_01();  // заполненность (0 - пустой, 1 - заполнен)
    }
 
    double poz;
    cout << "Введите номер этажа, где находится человек: ";
    cin >> poz;
    cout << endl;
 
    //печать позий лифтов и их заполненности
    for (int j = 0; j < 3; j++){
        cout << j + 1 << "-ый лифт находится на " << lifts[0][j] << " этаже и он ";
        if (lifts[1][j] == 1) {
            cout << "заполнен";
        }
        else{
            cout << "пустой";
        }
        cout << endl;
    }
    
    system("pause");
}
Массив целочисленный. Первая функция изменена, добавлена вторая.
Frip
1 / 1 / 1
Регистрация: 04.11.2013
Сообщений: 257
09.10.2015, 22:50  [ТС]     Коряво работает сброс рандома #3
Спасибо за доп. функцию, но все равно, при генерации чисел, постоянно первое число одинаковое, запустил 3 раза программу (16, 34, 2) (16, 7, 3) (16, 25, 10). Первое число почему-то всегда остается постоянным.
nmcf
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,579
09.10.2015, 23:22     Коряво работает сброс рандома #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Какая-то проблема или с этим древним rand() или с преобразованием в диапазон. Используй современные средства:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <random>
#include <chrono>
 
using namespace std;
 
//функция модуль
double aabs(double a, double b){
    double c;
    c = a - b;
    if (c<0){ 
        c = c * (-1); 
    }
    return c;
}
 
//функция случайного числа в диапазоне от a до b
inline int random_ab(int a, int b, std::default_random_engine &g)
{
    //return a + (b - a) * ((double)rand() / (double)RAND_MAX);
    std::uniform_int_distribution<int> distribution(a, b);
    return distribution(g);
}
inline int random_01()
    {
        return rand() < RAND_MAX / 2 ? 0 : 1;
    }
 
 
int main()
{
//================================================
    std::default_random_engine g(std::chrono::system_clock::now().time_since_epoch().count());
//================================================
 
    setlocale(LC_ALL, "Russian");
 
    srand(time(NULL));
 
 
    //объявление массива лифтов и их заполненности
    int lifts[2][3];
 
    //цикл заполнения позиции лифтов и их заполненности
    for (int ii = 0; ii < 3 ; ii++){
        lifts[0][ii] = random_ab(1, 40, g); // позиция лифта
        lifts[1][ii] = random_01();  // заполненность (0 - пустой, 1 - заполнен)
    }
 
    double poz;
    cout << "Введите номер этажа, где находится человек: ";
    cin >> poz;
    cout << endl;
 
    //печать позий лифтов и их заполненности
    for (int j = 0; j < 3; j++){
        cout << j + 1 << "-ый лифт находится на " << lifts[0][j] << " этаже и он ";
        if (lifts[1][j] == 1) {
            cout << "заполнен";
        }
        else{
            cout << "пустой";
        }
        cout << endl;
    }
    
    system("pause");
}
Числа не повторяются при таком способе.
Frip
1 / 1 / 1
Регистрация: 04.11.2013
Сообщений: 257
10.10.2015, 11:53  [ТС]     Коряво работает сброс рандома #5
Спасибо.
Осталось пара вопросов

1) Почему вы иногда оставляете std, мы ведь прописали пространство имен.
2) Какие современные средства вы имеете ввиду. Заметил для себя незнакомое в 20, 23, 35 строках.
tezaurismosis
Супер-модератор
 Аватар для tezaurismosis
6329 / 2957 / 465
Регистрация: 17.04.2012
Сообщений: 7,381
Записей в блоге: 14
Завершенные тесты: 4
10.10.2015, 12:30     Коряво работает сброс рандома #6
Цитата Сообщение от Frip Посмотреть сообщение
Заметил для себя незнакомое в 20, 23, 35 строках
Это средства из стандарта C++ 11
std::default_random_engine - генератор псевдослучайных чисел
std::uniform_int_distribution - генерирует псевдослучайные числа, соответствующие дискретному равномерному распределению

std::chrono - "библиотека" для работы с временем
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2015, 12:36     Коряво работает сброс рандома
Еще ссылки по теме:

Вывести на экран матрицу без указателей и рандома C++
Сброс битов C++
Сброс настроек C++

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

Или воспользуйтесь поиском по форуму:
nmcf
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,579
10.10.2015, 12:36     Коряво работает сброс рандома #7
Цитата Сообщение от Frip Посмотреть сообщение
Почему вы иногда оставляете std
Ну иногда просто копирую оттуда, где есть std, или оставляю для определённости.
Yandex
Объявления
10.10.2015, 12:36     Коряво работает сброс рандома
Ответ Создать тему
Опции темы

Текущее время: 07:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru