Форум программистов, компьютерный форум, киберфорум
Scilab
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 3
Регистрация: 27.12.2012
Сообщений: 192
1

Поток сообщений.Одни нули

07.04.2014, 14:12. Показов 2072. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Поток сообщений выдает 600 строк нулей
[0:0]
[0:0]
[0:0]
а надо
[1:3]
[2:1]
[3:3]
[2:4]
Помогите исправить прогу. Спасибо
Matlab M
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
    types = zeros(1, 3) //количество появлений сообщения типа i
    receivers = zeros(3, 4) // количество отправки сообщения типа i j-му приемнику
    printf('Сообщения:\n');
    y = rand(1, 400, 'uniform');
    i = 1;
    while(i <= 400)
        mType = y(i);
        mReceiver = mType, rand(0, 'uniform');
        printf('\t[%i : %i]\n', mType, mReceiver);
        //types(1, mType) = types(1, mType) + 1;
        //receivers(mType, mReceiver) = receivers(mType, mReceiver) + 1;
        i = i + 1;
    end
 
    if (randomValue <= 0.59) then
        messageType = 1
    else
        if (randomValue <= 0.89) then
            messageType = 2
        else
            messageType = 3
        end
    end
 
    select (messageType)
    case 1
        if randomValue <= 0.48 then
            receiverNumber = 1
        else
            if randomValue <= 0.49 then
                receiverNumber = 2
            else
                if randomValue <= 0.93 then
                    receiverNumber = 3
                else
                    receiverNumber = 4
                end
            end
        end,
    case 2
        if randomValue <= 0.02 then
            receiverNumber = 1
        else
            if randomValue <= 0.18 then
                receiverNumber = 2
            else
                if randomValue <= 0.57 then
                    receiverNumber = 3
                else
                    receiverNumber = 4
                end
            end
        end,
    case 3
        if randomValue <= 0.57 then
            receiverNumber = 1
        else
            if randomValue <= 0.78 then
                receiverNumber = 2
            else
                receiverNumber = 3
            end
        end
    end
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2014, 14:12
Ответы с готовыми решениями:

Получить поток из 100k сообщений и для сообщения каждого типа определить
Помогите пожалуйста написать программу в Scilab. 1)Генерация сообщений различных типов. На...

Поток сообщений - ошибка "Неправильный индекс" в 13 и 14-ой строке
Ошибка &quot;Неправильный индекс&quot; в 13 и 14-ой строке. Помогите разобраться, что там не так ...

UART: получаю одни нули.
Здравствуйте. Когда пробовал посылать периодически с МК букву n, то все получалось: ldi r17,n...

Выборка из БД выводит одни нули
Доброго времени суток. Помогите пожалуйста. Выбираю данные из БД, но почему то выводит одни нули. ...

22
143 / 133 / 42
Регистрация: 11.03.2013
Сообщений: 274
07.04.2014, 14:25 2
Окончание цикла while не в том месте стоит - программа ничего не считает. Дальше - непонятная переменная randomValue?
0
1 / 1 / 3
Регистрация: 27.12.2012
Сообщений: 192
07.04.2014, 14:31  [ТС] 3
olbond,
Matlab M
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
funcprot (0)
    types = zeros(1, 3) //количество появлений сообщения типа i
    receivers = zeros(3, 4) // количество отправки сообщения типа i j-му приемнику
    printf('Сообщения:\n');
    randomValue = rand(1, 400, 'uniform');
    getMessageType = type;
    i = 1;
    while(i <= 400)
        mType = getMessageType(randomValue(i));
        mReceiver = mType, rand(0, 'uniform');
        printf('\t[%i : %i]\n', mType, mReceiver);
        //types(1, mType) = types(1, mType) + 1;
        //receivers(mType, mReceiver) = receivers(mType, mReceiver) + 1;
 
    if (randomValue <= 0.59) then
        messageType = 1
    else
        if (randomValue <= 0.89) then
            messageType = 2
        else
            messageType = 3
        end
    end
 
    select (messageType)
    case 1
        if randomValue <= 0.48 then
            receiverNumber = 1
        else
            if randomValue <= 0.49 then
                receiverNumber = 2
            else
                if randomValue <= 0.93 then
                    receiverNumber = 3
                else
                    receiverNumber = 4
                end
            end
        end,
    case 2
        if randomValue <= 0.02 then
            receiverNumber = 1
        else
            if randomValue <= 0.18 then
                receiverNumber = 2
            else
                if randomValue <= 0.57 then
                    receiverNumber = 3
                else
                    receiverNumber = 4
                end
            end
        end,
    case 3
        if randomValue <= 0.57 then
            receiverNumber = 1
        else
            if randomValue <= 0.78 then
                receiverNumber = 2
            else
                receiverNumber = 3
            end
        end
    end
        i = i + 1;
end
Вот исправил. Правда теперь выводит [1:1]
0
143 / 133 / 42
Регистрация: 11.03.2013
Сообщений: 274
07.04.2014, 15:16 4
Лучший ответ Сообщение было отмечено Арти7030 как решение

Решение

Функция type() идентифицирует тип переменной - во всех случаях будет один. Далее - переменной mReceiver (в строке 10) присваивается значение переменной mType, что также будет один.

У Вас неправильно реализовано if else условие, в результате ничего не сохраняется.

Добавлено через 6 минут
Matlab M
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
   
    types = zeros(1, 3) //количество появлений сообщения типа i
    receivers = zeros(3, 4) // количество отправки сообщения типа i j-му приемнику
    printf('Сообщения:\n');
    randomValue = rand(1, 400, 'uniform');
    getMessageType = type;
    i = 1;
    while(i <= 400)
 
    if (randomValue(i) <= 0.59) then
        messageType = 1
    else
        if (randomValue(i) <= 0.89) then
            messageType = 2
        else
            messageType = 3
        end
    end
 
    select (messageType)
    case 1
        if randomValue(i) <= 0.48 then
            receiverNumber = 1
        else
            if randomValue(i) <= 0.49 then
                receiverNumber = 2
            else
                if randomValue(i) <= 0.93 then
                    receiverNumber = 3
                else
                    receiverNumber = 4
                end
            end
        end,
    case 2
        if randomValue(i) <= 0.02 then
            receiverNumber = 1
        else
            if randomValue(i) <= 0.18 then
                receiverNumber = 2
            else
                if randomValue(i) <= 0.57 then
                    receiverNumber = 3
                else
                    receiverNumber = 4
                end
            end
        end,
    case 3
        if randomValue(i) <= 0.57 then
            receiverNumber = 1
        else
            if randomValue(i) <= 0.78 then
                receiverNumber = 2
            else
                receiverNumber = 3
            end
        end
    end
            printf('\t[%i : %i]\n', messageType, receiverNumber);
        i = i + 1;
end
0
1 / 1 / 3
Регистрация: 27.12.2012
Сообщений: 192
07.04.2014, 15:23  [ТС] 5
olbond, Спасибо огромное. Ещё вопрос: можно реализовать эту программу без условия select-case, а только с if - then - else и если можно то просто заменить select-case на if - then - else.
0
143 / 133 / 42
Регистрация: 11.03.2013
Сообщений: 274
07.04.2014, 17:23 6
Цитата Сообщение от Арти7030 Посмотреть сообщение
можно реализовать эту программу без условия select-case, а только с if - then - else
Можно, но не целесообразно - тяжело будет код читаться.
0
1 / 1 / 3
Регистрация: 27.12.2012
Сообщений: 192
08.04.2014, 10:14  [ТС] 7
olbond, я знаю, что надоел, но вот какая проблема вылезла. В первом варианте программы не правильно заполняется "Количество поступлений", а во втором правильно. Хотя всё тоже самое. Ещё помогите решить одну проблему.
Matlab M
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
funcprot()
 
types = zeros (1, 3) // количество появлений сообщения типа i
receivers = zeros(3, 4) // количество отправки сообщения типа i j-му приемнику
printf('Сообщения:\n');
randomValue = rand(1, 600, 'uniform');
getMessageType = type;
i = 1;
while (i <= 600)
 
if (randomValue(i) <= 0.79) then
        messageType = 1
    else
if (randomValue(i) <= 0.85) then
        messageType = 2
    else
        messageType = 3
    end
end
 
         if randomValue(i) <= 0.09 then
            receiverNumber = 1
        else
         if randomValue(i) <= 0.67 then
            receiverNumber = 2
        else
         if randomValue(i) <= 0.79 then
            receiverNumber = 3
        else
            receiverNumber = 4
                end
            end
        end,
 
        if randomValue(i) <= 0.34 then
           receiverNumber = 1
       else
        if randomValue(i) <= 0.45 then
           receiverNumber = 2
       else
        if randomValue(i) <= 0.74 then
            receiverNumber = 3
       else
            receiverNumber = 4
                end
            end
        end,
 
        if randomValue(i) <= 0.68 then
           receiverNumber = 1
       else
         if randomValue(i) <= 0.92 then
            receiverNumber = 2
        else
            if randomValue <= 0.94 then
                receiverNumber = 3
            else
                receiverNumber = 4
            end
            end
        end
 
printf('\t[%i : %i]\n', messageType, receiverNumber);
types(1, messageType) = types(1, messageType) + 1;
receivers(messageType, receiverNumber) = receivers(messageType, receiverNumber) + 1;
i = i + 1;
end
    printf('\nКоличество и вероятность сообщений:\n');
    for i = 1:3
        printf('#%i : %i, вероятность: %f\n', i, types(i), types(i)/600);
    end
    printf('\nТеоретические значения:\n#1: 0.79\n#2: 0.06\n#3: 0.15');
    printf('\n');
 
    printf('\nКоличество поступлений:\n');
    for i = 1:3
        printf('#%i\t', i)
        for j = 1:4
            printf('%i (%f)\t', receivers(i, j), receivers(i, j) / types(i))
        end
        printf('\n')
    end
 
    printf('\nТеоретические значения:\n');
    printf('#1\t0,09\t0,58\t0,12\t0,21\n');
    printf('#2\t0,34\t0,11\t0,29\t0,26\n');
    printf('#3\t0,68\t0,24\t0,02\t0,06\n');
Matlab M
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// тип сообщения по значению числа
function messageType=getMessageType(randomValue)
    if (randomValue <= 0.79) then
        messageType = 1
    else
        if (randomValue <= 0.85) then
            messageType = 2
        else
            messageType = 3
        end
    end
endfunction
 
// номер приемника по типу сообщения и случайному числу
function receiverNumber=getReceiverNumber(messageType, randomValue)
    select (messageType)
    case 1
        if randomValue <= 0.09 then
            receiverNumber = 1
        else
            if randomValue <= 0.67 then
                receiverNumber = 2
            else
                if randomValue <= 0.79 then
                    receiverNumber = 3
                else
                    receiverNumber = 4
                end
            end
        end,
    case 2
        if randomValue <= 0.34 then
            receiverNumber = 1
        else
            if randomValue <= 0.45 then
                receiverNumber = 2
            else
                if randomValue <= 0.74 then
                    receiverNumber = 3
                else
                    receiverNumber = 4
                end
            end
        end,
    case 3
        if randomValue <= 0.68 then
            receiverNumber = 1
        else
            if randomValue <= 0.92 then
                receiverNumber = 2
            else
                if randomValue <= 0.94 then
                    receiverNumber = 3
                else
                    receiverNumber = 4
                end
            end
        end
    end
endfunction
 
function createMessageFlow()
    types = zeros(1, 3) //количество появлений сообщения типа i
    receivers = zeros(3, 4) // количество отправки сообщения типа i j-му приемнику
    printf('Сообщения:\n');
    y = rand(1, 600, 'uniform');
    i = 1;
    while(i <= 600)
        mType = getMessageType(y(i));
        mReceiver = getReceiverNumber(mType, rand(0, 'uniform'));
        printf('\t[%i : %i]\n', mType, mReceiver);
        types(1, mType) = types(1, mType) + 1;
        receivers(mType, mReceiver) = receivers(mType, mReceiver) + 1;
        i = i + 1;
    end
 
    printf('\nКоличество и вероятность сообщений:\n');
    for i = 1:3
        printf('#%i: %i, частота: %f\n', i, types(i), types(i)/600);
    end
    printf('\nТеоретические значения:\n#1: 0.79\n#2: 0.06\n#3: 0.15');
    printf('\n');
 
    printf('\nКоличество поступлений:\n');
    for i = 1:3
        printf('#%i\t', i)
        for j = 1:4
            printf('%i (%f)\t', receivers(i, j), receivers(i, j) / types(i))
        end
        printf('\n')
    end
 
    printf('\nТеоретические значения:\n');
    printf('#1\t0,09\t0,58\t0,12\t0,21\n');
    printf('#2\t0,34\t0,11\t0,29\t0,26\n');
    printf('#3\t0,68\t0,24\t0,02\t0,06\n');
endfunction
 
createMessageFlow();
0
143 / 133 / 42
Регистрация: 11.03.2013
Сообщений: 274
10.04.2014, 04:47 8
Если оба варианта идентичны то и результат должен быть одинаковый. Посмотрите внимательно - в первом варианте убран оператор select-case , в то же время нету никакого условия по типу сообщений. Далее, номер приемника определяется из того же массива случайных величин что и тип сообшения, хотя должно генерироваться новое случайное число для каждого идентифицированного типа сообщения (по крайней мере так реализовано во втором варианте).
0
1 / 1 / 3
Регистрация: 27.12.2012
Сообщений: 192
13.04.2014, 15:06  [ТС] 9
olbond, select-case убран потому что мне надо использовать if-then-else. Как сделать чтобы номер приемника определялся из другого массива случайных чисел?
0
143 / 133 / 42
Регистрация: 11.03.2013
Сообщений: 274
14.04.2014, 06:16 10
Убрав select-case надо добавить условие if-then-else иначе ничего не получиться (потому что для каждого сообщения - свой набор правил определения приемника). чтобы номер приемника определялся из другого массива случайных чисел - после определения типа сообщения, сгенирируйте случайное число (на каждом шаге по i) и используйте его для определения приемника.
0
1 / 1 / 3
Регистрация: 27.12.2012
Сообщений: 192
20.04.2014, 14:32  [ТС] 11
olbond, всё сделал. Как ещё можно сделать всё с циклом for, а не while?
Matlab M
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
types = zeros (1, 3)
receivers = zeros(3, 4)
printf('Сообщения:\n');
randomValue = rand(1, 600, 'uniform');
getMessageType = type;
i = 1;
while (i <= 600)
 
if (randomValue(i) <= 0.79) then
        messageType = 1
    else
if (randomValue(i) > 0.79)&(randomValue(i)<=0.85) then
        messageType = 2
    else
if (randomValue(i) > 0.85)&(randomValue(i) <= 1) then
        messageType = 3
    end
end
end
 
arrType(i) = messageType;
 
randomVal = rand(0, 'uniform');
arrrandomVal(i) = randomVal;
 
if messageType == 1 then
         if randomVal <= 0.09 then
            receiverNumber = 1
        else
         if (randomVal > 0.09)&(randomVal <= 0.67) then
            receiverNumber = 2
        else
         if (randomVal > 0.67)&(randomVal <= 0.79) then
            receiverNumber = 3
        else
         if (randomVal > 0.79)&(randomVal <= 1) then
            receiverNumber = 4
          end
       end
    end
end,
else
    if messageType == 2 then
        if randomVal <= 0.34 then
           receiverNumber = 1
       else
        if(randomVal > 0.34)&(randomVal <= 0.45) then
           receiverNumber = 2
       else
        if (randomVal > 0.45)&(randomVal <= 0.74) then
            receiverNumber = 3
       else
        if (randomVal > 0.74)&(randomVal <= 1) then
           receiverNumber = 4
          end
       end
    end
end,
else
    if messageType == 3 then
        if randomVal <= 0.68 then
           receiverNumber = 1
       else
         if (randomVal > 0.68)&(randomVal <= 0.92) then
            receiverNumber = 2
        else
            if (randomVal > 0.92)&(randomVal <= 0.94) then
                receiverNumber = 3
            else
             if (randomVal > 0.94)&(randomVal <= 1) then
                receiverNumber = 4
    end
    end
end
end,
end
end
end
        arrAdr(i) = receiverNumber;
printf('\t[%i : %i]\n', messageType, receiverNumber);
types(1, messageType) = types(1, messageType) + 1;
receivers(messageType, receiverNumber) = receivers(messageType, receiverNumber) + 1;
i = i + 1;
end
 
    printf('\nКоличество и вероятность сообщений:\n');
    for i = 1:3
        printf('#%i: %i, вероятность: %1.2f\n', i, types(i), types(i)/600);
    end
    printf('\nТеоретические значения:\n#1: 0.79\n#2: 0.06\n#3: 0.15');
    printf('\n');
 
    printf('\nКоличество поступлений:\n');
    for i = 1:3
        printf('#%i\t', i)
        for j = 1:4
           printf('%i (%1.2f)\t', receivers(i, j), receivers(i, j) / types(i))
        end
        printf('\n')
    end
 
    printf('\nТеоретические значения:\n');
    printf('#1\t0,09\t0,58\t0,12\t0,21\n');
    printf('#2\t0,34\t0,11\t0,29\t0,26\n');
    printf('#3\t0,68\t0,24\t0,02\t0,06\n');
0
143 / 133 / 42
Регистрация: 11.03.2013
Сообщений: 274
20.04.2014, 15:28 12
Вместо while пишем:

Matlab M
1
for i = 1:600
0
1 / 1 / 3
Регистрация: 27.12.2012
Сообщений: 192
24.04.2014, 12:15  [ТС] 13
olbond, Спасибо, но снова возникли вопросы. Помогите.
1) Расширить модель потока сообщений. Использовать случайную величину, распределенную в диапазоне [1, 30]
2) Определить характеристики последовательности длин а) математическое ожидание б) дисперсию в) среденеквадратичное отклонение.
Это сделал, прошу только проверить и если есть ошибки написать.
3) Выполнит проверку качества генерации длин методом. тест проверки независимости.

Прошу объясните 1 и 3 задание и проверьте 2-е.

Matlab M
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
types = zeros (1, 3)
receivers = zeros(3, 4)
printf('Сообщения:\n');
randomValue = rand(1, 600, 'uniform');
getMessageType = type;
for i = 1:600
 
if (randomValue(i) <= 0.79) then
        messageType = 1
    else
if (randomValue(i) > 0.79)&(randomValue(i)<=0.85) then
        messageType = 2
    else
if (randomValue(i) > 0.85)&(randomValue(i) <= 1) then
        messageType = 3
    end
end
end
 
arrType(i) = messageType;
 
randomVal = rand(0, 'uniform');
arrrandomVal(i) = randomVal;
 
if messageType == 1 then
         if randomVal <= 0.09 then
            receiverNumber = 1
        else
         if (randomVal > 0.09)&(randomVal <= 0.67) then
            receiverNumber = 2
        else
         if (randomVal > 0.67)&(randomVal <= 0.79) then
            receiverNumber = 3
        else
         if (randomVal > 0.79)&(randomVal <= 1) then
            receiverNumber = 4
          end
       end
    end
end,
else
    if messageType == 2 then
        if randomVal <= 0.34 then
           receiverNumber = 1
       else
        if(randomVal > 0.34)&(randomVal <= 0.45) then
           receiverNumber = 2
       else
        if (randomVal > 0.45)&(randomVal <= 0.74) then
            receiverNumber = 3
       else
        if (randomVal > 0.74)&(randomVal <= 1) then
           receiverNumber = 4
          end
       end
    end
end,
else
    if messageType == 3 then
        if randomVal <= 0.68 then
           receiverNumber = 1
       else
         if (randomVal > 0.68)&(randomVal <= 0.92) then
            receiverNumber = 2
        else
            if (randomVal > 0.92)&(randomVal <= 0.94) then
                receiverNumber = 3
            else
             if (randomVal > 0.94)&(randomVal <= 1) then
                receiverNumber = 4
    end
    end
end
end,
end
end
end
        arrAdr(i) = receiverNumber;
printf('\t[%i : %i]\n', messageType, receiverNumber);
types(1, messageType) = types(1, messageType) + 1;
receivers(messageType, receiverNumber) = receivers(messageType, receiverNumber) + 1;
end
 
    printf('\nКоличество и вероятность сообщений:\n');
    for i = 1:3
        printf('#%i: %i, вероятность: %1.2f\n', i, types(i), types(i)/600);
    end
    printf('\nТеоретические значения:\n#1: 0.79\n#2: 0.06\n#3: 0.15');
    printf('\n');
 
    printf('\nКоличество поступлений:\n');
    for i = 1:3
        printf('#%i\t', i)
        for j = 1:4
           printf('%i (%1.2f)\t', receivers(i, j), receivers(i, j) / types(i))
        end
        printf('\n')
    end
 
    printf('\nТеоретические значения:\n');
    printf('#1\t0,09\t0,58\t0,12\t0,21\n');
    printf('#2\t0,34\t0,11\t0,29\t0,26\n');
    printf('#3\t0,68\t0,24\t0,02\t0,06\n');
    
// Математическое ожидание
mo_n = 0;
mo_t = 0;
 for i = 1:600
        mo_n  = mo_n + randomValue(i);
        mo_t  = mo_t + randomVal();
 end
 printf("Математическое ожидание: длина - %f, время - %f\n", (mo_n/600), (mo_t/600));
mo_n = mo_n / 600;
mo_t = mo_t / 600;
// Дисперсия
d_n = 0;
d_t = 0;
 for i = 1:600
       d_n = d_n + ((randomValue(i) - mo_n)^2);
       d_t = d_t + ((randomVal() - mo_t)^2);
 end
d_n = d_n / 600;
d_t = d_t / 600;
printf("Дисперсия: длина - %f, время - %f\n", d_n, d_t);
printf("СКО: длина - %f, время - %f\n", sqrt(d_n), sqrt(d_t));
0
143 / 133 / 42
Регистрация: 11.03.2013
Сообщений: 274
24.04.2014, 13:38 14
По 3 пункту: ничего не могу сказать, непонятна задача.
По 1 пункту: для генерации в диапазоне (1,30) можно использовать команду grand(1, 600, "unf", 1, 30), но возникает вопрос с правилами определения типа сообщения - они определены для диапазона (0,1)?

По 2 пункту: почему бы для суммирования не использовать стандартную комманду sum?
В строках 110 и 120 наверное надо использовать arrrandomVal(i) ? А так вроде все верно.
0
1 / 1 / 3
Регистрация: 27.12.2012
Сообщений: 192
24.04.2014, 14:32  [ТС] 15
olbond, можно про команду grand, куда её вписать и что она даст?
0
143 / 133 / 42
Регистрация: 11.03.2013
Сообщений: 274
24.04.2014, 14:48 16
Про команду grand() можно подробно посмотреть в справке SciLab, а вписать ее нужно там где необходим диапазон (1,30), Я полагаю randomValue = ...
0
1 / 1 / 3
Регистрация: 27.12.2012
Сообщений: 192
24.04.2014, 19:02  [ТС] 17
olbond, Сделал, но scilab заявляет что в 95 строке "Деление на ноль" ?
Matlab M
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
types = zeros (1, 3)
receivers = zeros(3, 4)
printf('Сообщения:\n');
randomValue = grand(1, 600, "unf", 1, 30);
getMessageType = type;
for i = 1:600
 
if (randomValue(i) <= 0.79) then
        messageType = 1
    else
if (randomValue(i) > 0.79)&(randomValue(i)<=0.85) then
        messageType = 2
    else
if (randomValue(i) > 0.85)&(randomValue(i) <= 1) then
        messageType = 3
    end
end
end
 
arrType(i) = messageType;
 
randomVal = rand(0, 'uniform');
arrrandomVal(i) = randomVal;
 
if messageType == 1 then
         if randomVal <= 0.09 then
            receiverNumber = 1
        else
         if (randomVal > 0.09)&(randomVal <= 0.67) then
            receiverNumber = 2
        else
         if (randomVal > 0.67)&(randomVal <= 0.79) then
            receiverNumber = 3
        else
         if (randomVal > 0.79)&(randomVal <= 1) then
            receiverNumber = 4
          end
       end
    end
end,
else
    if messageType == 2 then
        if randomVal <= 0.34 then
           receiverNumber = 1
       else
        if(randomVal > 0.34)&(randomVal <= 0.45) then
           receiverNumber = 2
       else
        if (randomVal > 0.45)&(randomVal <= 0.74) then
            receiverNumber = 3
       else
        if (randomVal > 0.74)&(randomVal <= 1) then
           receiverNumber = 4
          end
       end
    end
end,
else
    if messageType == 3 then
        if randomVal <= 0.68 then
           receiverNumber = 1
       else
         if (randomVal > 0.68)&(randomVal <= 0.92) then
            receiverNumber = 2
        else
            if (randomVal > 0.92)&(randomVal <= 0.94) then
                receiverNumber = 3
            else
             if (randomVal > 0.94)&(randomVal <= 1) then
                receiverNumber = 4
    end
    end
end
end,
end
end
end
        arrAdr(i) = receiverNumber;
printf('\t[%i : %i]\n', messageType, receiverNumber);
types(1, messageType) = types(1, messageType) + 1;
receivers(messageType, receiverNumber) = receivers(messageType, receiverNumber) + 1;
end
 
    printf('\nКоличество и вероятность сообщений:\n');
    for i = 1:3
        printf('#%i: %i, вероятность: %1.2f\n', i, types(i), types(i)/600);
    end
    printf('\nТеоретические значения:\n#1: 0.79\n#2: 0.06\n#3: 0.15');
    printf('\n');
 
    printf('\nКоличество поступлений:\n');
    for i = 1:3
        printf('#%i\t', i)
        for j = 1:4
           printf('%i (%1.2f)\t', receivers(i, j), receivers(i, j) / types(i))
        end
        printf('\n')
    end
 
    printf('\nТеоретические значения:\n');
    printf('#1\t0,09\t0,58\t0,12\t0,21\n');
    printf('#2\t0,34\t0,11\t0,29\t0,26\n');
    printf('#3\t0,68\t0,24\t0,02\t0,06\n');
    
// Математическое ожидание
mo_n = 0;
mo_t = 0;
 for i = 1:600
        mo_n  = mo_n + randomValue(i)*10;
        mo_t  = mo_t + arrrandomVal(i)*10;
 end
 printf("\nМатематическое ожидание: длина - %1.2f, время - %1.2f\n", (mo_n/600), (mo_t/600));
mo_n = mo_n / 600;
mo_t = mo_t / 600;
// Дисперсия
d_n = 0;
d_t = 0;
 for i = 1:600
       d_n = d_n + ((randomValue(i) - mo_n)^2);
       d_t = d_t + ((arrrandomVal(i) - mo_t)^2);
 end
d_n = d_n / 600;
d_t = d_t / 600;
printf("Дисперсия: длина - %1.2f, время - %1.2f\n", d_n, d_t);
printf("СКО: длина - %1.2f, время - %1.2f\n", sqrt(d_n), sqrt(d_t));
0
143 / 133 / 42
Регистрация: 11.03.2013
Сообщений: 274
25.04.2014, 10:20 18
Цитата Сообщение от Арти7030 Посмотреть сообщение
Сделал, но scilab заявляет что в 95 строке "Деление на ноль"
Ну это и не удивительно, Я ж намекнул что случайные числа у Вас теперь в диапазоне (1,30), а тип сообщений определяется из диапазона (0,1), и вообще должно выдавать ошибку "!--error 4 Undefined variable: messageType".

В строках 8-16 нужно задать новые интервалы, в соответствии с диапазоном случайной переменной randomValue.
0
1 / 1 / 3
Регистрация: 27.12.2012
Сообщений: 192
25.04.2014, 17:25  [ТС] 19
olbond, вот так?
Matlab M
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
types = zeros (1, 3)
receivers = zeros(3, 4)
printf('Сообщения:\n');
randomValue = grand(1, 600, "unf", 1, 30);
getMessageType = type;
for i = 1:600
 
if (randomValue(i) <= 24) then
        messageType = 1
    else
if (randomValue(i) > 24)&(randomValue(i)<=26) then
        messageType = 2
    else
if (randomValue(i) > 26)&(randomValue(i) <= 30) then
        messageType = 3
    end
end
end
 
arrType(i) = messageType;
 
randomVal = rand(0, 'uniform');
arrrandomVal(i) = randomVal;
 
if messageType == 1 then
         if randomVal <= 0.09 then
            receiverNumber = 1
        else
         if (randomVal > 0.09)&(randomVal <= 0.67) then
            receiverNumber = 2
        else
         if (randomVal > 0.67)&(randomVal <= 0.79) then
            receiverNumber = 3
        else
         if (randomVal > 0.79)&(randomVal <= 1) then
            receiverNumber = 4
          end
       end
    end
end,
else
    if messageType == 2 then
        if randomVal <= 0.34 then
           receiverNumber = 1
       else
        if(randomVal > 0.34)&(randomVal <= 0.45) then
           receiverNumber = 2
       else
        if (randomVal > 0.45)&(randomVal <= 0.74) then
            receiverNumber = 3
       else
        if (randomVal > 0.74)&(randomVal <= 1) then
           receiverNumber = 4
          end
       end
    end
end,
else
    if messageType == 3 then
        if randomVal <= 0.68 then
           receiverNumber = 1
       else
         if (randomVal > 0.68)&(randomVal <= 0.92) then
            receiverNumber = 2
        else
            if (randomVal > 0.92)&(randomVal <= 0.94) then
                receiverNumber = 3
            else
             if (randomVal > 0.94)&(randomVal <= 1) then
                receiverNumber = 4
    end
    end
end
end,
end
end
end
        arrAdr(i) = receiverNumber;
printf('\t[%i : %i]\n', messageType, receiverNumber);
types(1, messageType) = types(1, messageType) + 1;
receivers(messageType, receiverNumber) = receivers(messageType, receiverNumber) + 1;
end
 
    printf('\nКоличество и вероятность сообщений:\n');
    for i = 1:3
        printf('#%i: %i, вероятность: %1.2f\n', i, types(i), types(i)/600);
    end
    printf('\nТеоретические значения:\n#1: 0.79\n#2: 0.06\n#3: 0.15');
    printf('\n');
 
    printf('\nКоличество поступлений:\n');
    for i = 1:3
        printf('#%i\t', i)
        for j = 1:4
           printf('%i (%1.2f)\t', receivers(i, j), receivers(i, j) / types(i))
        end
        printf('\n')
    end
 
    printf('\nТеоретические значения:\n');
    printf('#1\t0,09\t0,58\t0,12\t0,21\n');
    printf('#2\t0,34\t0,11\t0,29\t0,26\n');
    printf('#3\t0,68\t0,24\t0,02\t0,06\n');
    
// Математическое ожидание
mo_n = 0;
mo_t = 0;
 for i = 1:600
        mo_n  = mo_n + randomValue(i)*10;
        mo_t  = mo_t + arrrandomVal(i)*10;
 end
 printf("\nМатематическое ожидание: длина - %1.2f, время - %1.2f\n", (mo_n/600), (mo_t/600));
mo_n = mo_n / 600;
mo_t = mo_t / 600;
// Дисперсия
d_n = 0;
d_t = 0;
 for i = 1:600
       d_n = d_n + ((randomValue(i) - mo_n)^2);
       d_t = d_t + ((arrrandomVal(i) - mo_t)^2);
 end
d_n = d_n / 600;
d_t = d_t / 600;
printf("Дисперсия: длина - %1.2f, время - %1.2f\n", d_n, d_t);
printf("СКО: длина - %1.2f, время - %1.2f\n", sqrt(d_n), sqrt(d_t));
0
143 / 133 / 42
Регистрация: 11.03.2013
Сообщений: 274
25.04.2014, 17:30 20
Если результат соответствует ожиданиям, значит так.
0
25.04.2014, 17:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2014, 17:30
Помогаю со студенческими работами здесь

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

Attiny USART Proteus7.10 VirtualTerminal приходят одни нули
Листинг проги, взят банально из даташита на attiny 2313. Подрубаю ее в протуесу к виртуальному...

Программа выдает одни нули при сортировке массива
вот код, программа вместо того , что-бы отсортировать массив по возрастанию , выдает на вывод одни...

выдать участок размером K x K, в котором содержатся только одни нули
В массиве A(N, M), заполненном нулями и единицами, выделите такой квадратный участок размером K x...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru