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

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

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

Студворк — интернет-сервис помощи студентам
Поток сообщений выдает 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.04.2014, 14:12
Ответы с готовыми решениями:

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

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

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

22
143 / 133 / 42
Регистрация: 11.03.2013
Сообщений: 274
07.04.2014, 14:25
Окончание цикла while не в том месте стоит - программа ничего не считает. Дальше - непонятная переменная randomValue?
0
1 / 1 / 3
Регистрация: 27.12.2012
Сообщений: 192
07.04.2014, 14:31  [ТС]
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
Лучший ответ Сообщение было отмечено Арти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  [ТС]
olbond, Спасибо огромное. Ещё вопрос: можно реализовать эту программу без условия select-case, а только с if - then - else и если можно то просто заменить select-case на if - then - else.
0
143 / 133 / 42
Регистрация: 11.03.2013
Сообщений: 274
07.04.2014, 17:23
Цитата Сообщение от Арти7030 Посмотреть сообщение
можно реализовать эту программу без условия select-case, а только с if - then - else
Можно, но не целесообразно - тяжело будет код читаться.
0
1 / 1 / 3
Регистрация: 27.12.2012
Сообщений: 192
08.04.2014, 10:14  [ТС]
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
Если оба варианта идентичны то и результат должен быть одинаковый. Посмотрите внимательно - в первом варианте убран оператор select-case , в то же время нету никакого условия по типу сообщений. Далее, номер приемника определяется из того же массива случайных величин что и тип сообшения, хотя должно генерироваться новое случайное число для каждого идентифицированного типа сообщения (по крайней мере так реализовано во втором варианте).
0
1 / 1 / 3
Регистрация: 27.12.2012
Сообщений: 192
13.04.2014, 15:06  [ТС]
olbond, select-case убран потому что мне надо использовать if-then-else. Как сделать чтобы номер приемника определялся из другого массива случайных чисел?
0
143 / 133 / 42
Регистрация: 11.03.2013
Сообщений: 274
14.04.2014, 06:16
Убрав select-case надо добавить условие if-then-else иначе ничего не получиться (потому что для каждого сообщения - свой набор правил определения приемника). чтобы номер приемника определялся из другого массива случайных чисел - после определения типа сообщения, сгенирируйте случайное число (на каждом шаге по i) и используйте его для определения приемника.
0
1 / 1 / 3
Регистрация: 27.12.2012
Сообщений: 192
20.04.2014, 14:32  [ТС]
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
Вместо while пишем:

Matlab M
1
for i = 1:600
0
1 / 1 / 3
Регистрация: 27.12.2012
Сообщений: 192
24.04.2014, 12:15  [ТС]
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
По 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  [ТС]
olbond, можно про команду grand, куда её вписать и что она даст?
0
143 / 133 / 42
Регистрация: 11.03.2013
Сообщений: 274
24.04.2014, 14:48
Про команду grand() можно подробно посмотреть в справке SciLab, а вписать ее нужно там где необходим диапазон (1,30), Я полагаю randomValue = ...
0
1 / 1 / 3
Регистрация: 27.12.2012
Сообщений: 192
24.04.2014, 19:02  [ТС]
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
Цитата Сообщение от Арти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  [ТС]
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
Если результат соответствует ожиданиям, значит так.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.04.2014, 17:30
Помогаю со студенческими работами здесь

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

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

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

Программа выдает одни нули при сортировке массива
вот код, программа вместо того , что-бы отсортировать массив по возрастанию , выдает на вывод одни нули #include&lt;stdio.h&gt; ...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru