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

Плохо работает ГСЧ - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Создайте два стека для символов http://www.cyberforum.ru/cpp-beginners/thread766748.html
Создайте два стека для символов. Вводите символы с клавиатуры. При этом латинские буквы должны попадать в первый стек, цифры – во второй, любые другие символы пропускаются. После ввода с клавиатуры эталонного символа (например #) выведите на экран содержимое обоих стеков.
C++ Dev C++ не работает с регистрами В ВС31 проблем не было. А вот DEv C++ не хочет работать с регистрами. Кто знает, в чем проблема? Вот код программы: #include <dos.h> #include <graphics.h> #include <stdio.h> #include <conio.h> REGS regs; http://www.cyberforum.ru/cpp-beginners/thread766738.html
производная C++
написать программу которая высчитывает производную (x-1/x+1) в 4 степени
Напечатать следующие числа в таблице C++
Помогите пажалуйста) Я тут сдела так примерно первой задачи. Подскажите как сделать правильно очень прошу. #include <iostream> using namespace std; void main () { int n=0; for (int i=0;i<=5;i++) {
C++ Перегрузки функции http://www.cyberforum.ru/cpp-beginners/thread766716.html
вот задание: Задание 1: Разработка класса. Разработайте класс FRACTION. Элемент класса: ? числитель; ? знаменатель. Методы: ? конструктор без параметров ( по умолчанию); ? конструктор с параметрами;
C++ Найти кол-во совпадающих элементов двух двумерных массивов Помогите плиз. Написать программу на языке С + +, которая находит количество элементов 2-мерного массива, которые совпадают с элементами другого аналогичного массива и выводит это количество на экран. подробнее

Показать сообщение отдельно
vlad_light
4 / 4 / 0
Регистрация: 24.09.2012
Сообщений: 178

Плохо работает ГСЧ - C++

20.01.2013, 03:03. Просмотров 427. Ответов 14
Метки (Все метки)

Подскажите, пожалуйста, как изменить программу, чтоб ГСЧ работал хорошо? Мне нужно, чтоб на каждой итерации у меня генерировался "хороший" вектор X, а оно мне генерирует пачками одинаковые. Как это можно обойти? И по коду подскажите -- где что поисправлять. Заранее весьма благодарен!
Кликните здесь для просмотра всего текста
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
71
// TPMVector.h
 
#pragma once
 
#include <vector>
 
class TPMVector 
{
public:
    TPMVector ();
    TPMVector (const TPMVector& copy);
    TPMVector& operator= (const TPMVector& copy);
 
    ~TPMVector ();
 
    std::vector<std::vector<int>> TPMvec;
    
    void initRandomVector (const int K, const int N);
};
// TPMVector.cpp
 
#include "TPMVector.h"
 
#include <cstdlib>
#include <ctime>
 
TPMVector::TPMVector ()
{
 
}
 
TPMVector::TPMVector (const TPMVector& copy)
{
    TPMvec = copy.TPMvec;
}
 
TPMVector& TPMVector::operator= (const TPMVector& copy)
{
    TPMvec = copy.TPMvec;
    return *this;
}
 
TPMVector::~TPMVector ()
{
 
}
 
void TPMVector::initRandomVector (int K, int N)
{
    srand ((unsigned int) time (NULL));
    const int LABEL = RAND_MAX / 2;
 
    TPMvec.reserve (K);
    TPMvec.clear ();
    
    for (int i = 0; i < K; ++i)
    {
        std::vector<int> random_vector;
        random_vector.reserve (N);
 
        for (int j = 0; j < N; ++j)
        {
            if (rand () > LABEL)
                random_vector.push_back (1);
            else
                random_vector.push_back (-1);
        }
 
        TPMvec.push_back (random_vector);
    }
}

Кликните здесь для просмотра всего текста
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
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
// TPM.h
 
#pragma once
 
#include "TPMVector.h"
 
int sign (const int x);
int g (const int x, const int L);
int theta (const int x);
 
int metric (const TPMVector& vec1, const TPMVector& vec2);
 
class TPM
{
private:
    int K, N, L;
    TPMVector Weights;
    std::vector<int> Sigma;
 
public:
    TPM ();
    TPM (const TPM& copy);
    TPM (const int K_value, const int N_value, const int L_value);
    TPM& operator= (const TPM& copy);
 
    ~TPM ();
 
    void initK (const int value);
    void initN (const int value);
    void initL (const int value);
 
    void initWeights ();
    void updateSigma (const TPMVector& random_vector);
    int TPMoutput () const;
    void updateWeights (const TPMVector& random_vector, const int received_bit);
    
    TPMVector returnWeights () const;
};
// TPM.cpp
 
#include "TPM.h"
 
#include <cstdlib>
#include <ctime>
 
int sign (const int x)
{
    if (x > 0)
        return 1;
 
    return -1;
}
 
int g (const int x, const int L)
{
    if (x > L || x < -L)
        return L * sign (x);
 
    return x;
}
 
int theta (const int x)
{
    if (x > 0)
        return 1;
 
    return 0;
}
 
int metric (const TPMVector& vec1, const TPMVector& vec2)
{
    int sum = 0;
 
    for (auto ITER1 = vec1.TPMvec.cbegin (), ITER2 = vec2.TPMvec.cbegin (); ITER1 != vec1.TPMvec.cend (); ++ITER1, ++ITER2)
        for (auto iter1 = ITER1->cbegin (), iter2 = ITER2->cbegin (); iter1 != ITER1->cend (); ++iter1, ++iter2)
            sum = sum + (*iter1 - *iter2) * (*iter1 - *iter2);
 
    return sum;
}
 
TPM::TPM ()
{
 
}
 
TPM::TPM (const TPM& copy)
{
    K = copy.K;
    N = copy.N;
    L = copy.L;
    Weights = copy.Weights;
    Sigma = copy.Sigma;
}
 
TPM::TPM (const int K_value, const int N_value, const int L_value)
{
    K = K_value;
    N = N_value;
    L = L_value;
}
 
TPM& TPM::operator= (const TPM& copy)
{
    K = copy.K;
    N = copy.N;
    L = copy.L;
    Weights = copy.Weights;
    Sigma = copy.Sigma;
 
    return *this;
}
 
TPM::~TPM ()
{
 
}
 
void TPM::initK (const int value)
{
    K = value;
}
 
void TPM::initN (const int value)
{
    N = value;
}
 
void TPM::initL (const int value)
{
    L = value;
}
 
void TPM::initWeights ()
{
    srand ((unsigned int) time (NULL));
 
    Weights.TPMvec.reserve (K);
    
    for (int i = 0; i < K; ++i)
    {
        std::vector<int> random_vector;
        random_vector.reserve (N);
 
        for (int j = 0; j < N; ++j)
            random_vector.push_back (rand () % (2 * L + 1) - L);
        
        Weights.TPMvec.push_back (random_vector);
    }
}
 
void TPM::updateSigma (const TPMVector& random_vector)
{
    Sigma.clear ();
 
    for (int i = 0; i < K; ++i)
    {
        int sum = 0;
 
        for (int j = 0; j < N; ++j)
            sum += Weights.TPMvec.at(i).at(j) * random_vector.TPMvec.at(i).at(j);
        
        Sigma.push_back (sign (sum));
    }
}
 
int TPM::TPMoutput () const
{
    int prod = 1;
 
    for (auto iter = Sigma.cbegin (); iter != Sigma.cend (); ++iter)
        prod *= *iter;
 
    return prod;
}
 
void TPM::updateWeights (const TPMVector& random_vector, const int received_bit)
{
    const int output_bit = TPMoutput ();
 
    if (output_bit == received_bit)
    {
        for (int i = 0; i < K; ++i)
        {
            const int THETA = theta (Sigma.at(i) * output_bit);
 
            for (int j = 0; j < N; ++j)
                Weights.TPMvec.at(i).at(j) = g (Weights.TPMvec.at(i).at(j) + random_vector.TPMvec.at(i).at(j) * THETA, L);
        }
    }
}
 
TPMVector TPM::returnWeights () const
{
    return Weights;
}

Кликните здесь для просмотра всего текста
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
// main.cpp
 
#include "TPM.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
 
int main ()
{
    int K = 3, N = 4, L = 100;
 
    TPM A (K,N,L), B (K,N,L);
 
    A.initWeights ();
    B.initWeights ();
 
    std::cout << "Iter\tDist" << std::endl;
 
 
    for (int i = 0; i < 10000; ++i)
    {
        TPMVector X;
        X.initRandomVector (K, N);
 
        A.updateSigma (X);
        B.updateSigma (X);
 
        const int TAU_A = A.TPMoutput ();
        const int TAU_B = B.TPMoutput ();
 
        A.updateWeights (X, TAU_B);
        B.updateWeights (X, TAU_A);
 
        std::cout << i << "\t" <<metric (A.returnWeights (), B.returnWeights ()) << std::endl;
    }
 
    std::cin.get ();
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru