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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Chikagovec
1 / 1 / 0
Регистрация: 18.02.2010
Сообщений: 20
#1

Генерация чисел. Пуассон. Код не фурычит - C++

30.09.2012, 20:38. Просмотров 698. Ответов 5
Метки нет (Все метки)

Доброго времени суток.
Господа, кому несложно покопаться в коде, помогите понять, где тут ошибки? Программа запускается, число выборки ввожу и всё, вылетает. Я в этом деле нуб, так что буду рад самой жесткой критике.
Само задание выглядит примерно так: Генерац-я псевдо чисел. Неуниверсальный метод. Пуассоновское распределение, где М=2. входная характеристика программы: объем выборки гене-рируемой последовательности случайных чисел;
выходные характеристики:
– выборочная дисперсия;
– гистограмма для полученной последовательности;
– для неуниверсальных методов необходимо дополнительно выводить теоретические значения математического ожидания и дисперсии
.
По Пуассону там произведение сгенерированных чисел не должно превышать ехр^(-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
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
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<iostream.h>
#include<math.h>
 
 
int random ( int xx, int u, int mm ){
  /* function that creates random numbers ranging from 0 to m. */
    return (2*xx+u)%mm;
}
 
int * rand_poi ( int count ){
    int store[100];
    int N,xx;
    int kk;
    int temp=21;
    double pre,nextt;
    float randd;
    N=xx=0;
    for(kk=0;kk<100;kk++) store[kk]=0;
    while(N<count){
        temp=random(temp,1,100);
        randd=temp/100;
        pre=nextt=randd;
        if(randd<exp(-2)){ store[N++]=0; }
        else{
            pre=nextt;
            temp=random(temp,1,100);
            randd=temp/100;
            nextt=nextt*randd;
            while( !( pre>=exp(-2) && nextt<exp(-2) ) ){
                xx++;
                pre=nextt;
                temp=random(temp,1,100);
                randd=temp/100;
                nextt=nextt*randd;
            }
            store[N++]=xx;
            xx=0;
        }
    }
    for(kk=0;kk<N;kk++)  printf("%d ",store[kk]);
    return store;
 
}
 
void main()
 {
 clrscr();
 int N;
 int k=0;
 float *z, *W, x;
 int *Mas;
 float M, Disp, TeorM=2, TeorDisp=2;
 float sum1, sum2, sum3;
 double next=exp(-2);
 double pred=1;
 
    printf("How many numbers do you want to generate?");
    scanf("%d",&N);
 
 W=new float[N];
 
 
 
// randomize();
 
 
  /*do 
 {
    k++;
    x = (random(1000)/1000.0);
    pred *=x;
 }  while (pred>next); 
 return (k-1);
*/
//========================================== 
 
  sum1=0;
  for( int q=0; q<N; q++)
    {
    sum1+=W[q];
    }
 
  sum3=0;
  for( int a=0; a<N; a++)
    {
    sum3+=pow(W[a],2);
    }
 
 M = ((double)sum1/N);
 
 sum3=0;
 for(int b=0; b<N; b++)
    {
     sum3+=(double)pow((W[b]-M),2);
    }
 Disp = ((double)1 / (N-1)) * sum3;
 
 //====================================================
 
 float Wmin = 100;
 float Wmax = -100;
 
 for (int i = 0; i < N; i++)
    {
    if (W[i] < Wmin) Wmin = W[i];
    if (W[i] > Wmax) Wmax = W[i];
    }
 for(int t=1; t<=11;t++)
    {
    Mas[t]=0;
    }
 
 float P = (Wmax - Wmin) / 10.0;
 for(int E=1; E<=10; E++)
    {
    for ( i = 0; i < N; i++)
        {
         if (W[i] >= Wmin + (P * (E-1)) && W[i] < Wmin + (P * E)) Mas[E]++;
        }
    }
 
 
 for(int j=0;j<N;j++)
    {
    printf(" %3.5f", W[j]);
    }
 printf("\nЊ*вЋ¦Ё¤**ЁҐ=%5.5f \n„ЁбЇҐабЁп=%5.5f ", M,Disp);
 printf("\nЊ*вЋ¦Ё¤**ЁҐ’Ґ®а=%5.5f \n„ЁбЇҐабЁп’Ґ®а=%5.5f ", TeorM,TeorDisp);
 for(j=1; j<=10; j++)
    {
    printf("\n[%3.6f ; %3.6f] %d ",Wmin + (P * (j-1)),Wmin + (P * j) ,  Mas[j]);
    }
 
 getch();
 }
А ещё, подскажите, пожалуйста, как рандомно генерировать числа целые 0 и 1 ? А то Пуассон вроде требует.

Добавлено через 2 часа 47 минут
Я пытался соединить два кода.
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
#include<stdio.h>
#include<math.h>
#include <conio.h>
#include <stdlib.h>
 
int random ( int x, int r, int u, int m ){
  /* function that creates random numbers ranging from 0 to m. */
    return (r*x+u)%m;
}
 
int * rand_poi ( float r , int count ){
    int store[100];
    int n,x;
    int k;
    int temp=21;
    double pre,next;
    float rand;
    n=x=0;
    for(k=0;k<100;k++) store[k]=0;
    while(n<count){
        temp=random(temp,4,1,100);
        rand=temp/100;
        pre=next=rand;
        if(rand<exp(-r)){ store[n++]=0; }
        else{
            pre=next;
            temp=random(temp,4,1,100);
            rand=temp/100;
            next=next*rand;
            while( !( pre>=exp(-r) && next<exp(-r) ) ){
                x++;
                pre=next;
                temp=random(temp,4,1,100);
                rand=temp/100;
                next=next*rand;
            }
            store[n++]=x;
            x=0;
        }
    }
    for(k=0;k<n;k++)  printf("%d ",store[k]);
    return store;
 
}
 
void main(){
    int n,k;
    int *rand;
    float r;
    clrscr();
    printf("Enter r:");
    scanf("%f",&r);
    printf("How many numbers do you want to generate?");
    scanf("%d",&n);
    rand=rand_poi(r,n);
    printf("\nPress ENTER to exit...");
    getchar();
    getchar();
 
}
Но здесь как-то странно генерируются случайные числа. как-то неслучайно совсем.

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
void main()
 {
 textcolor(10);
 clrscr();
// int V1=6,V2=8;
 float N;
 float *z, x, *W;
 float sum, sum1, sum2,  sum3, sum4;
 int *Mas;
 float M, Disp, TM, TDisp;
 int i,j,a,q,k,l;
 
 cout<<"‚ўҐ¤ЁвҐ ЋЎкҐ¬:";
 cin>>N;
 
 Mas = new int[11];
 z = new float[N];
 W = new float[N];
 
 randomize();
 for( l=0; l<N; l++)
  {
   for(int j =0; j<12; j++)
    {
    z[j]=0;
    }
 
    sum1=sum2=0;
    for(int k=0;k<V1;k++)
        {
         sum=0;
         for(int i=0; i<N; i++)
            {
            x = (random(1000)/1000.0);
            sum+=x;
            }
        z[k]=(sum-(N*0.5))/(sqrt((double)N/12));
        sum1+=pow(z[k],2);
        }
    for( k=0;k<V2;k++)
        {
         sum=0;
         for(int i=0; i<N; i++)
            {
            x = (random(1000)/1000.0);
            sum+=x;
            }
        z[k]=(sum-(N*0.5))/(sqrt((double)N/12));
        sum2+=pow(z[k],2);
        }
 
 
  W[l]=((double)sum1/V1)/((double)sum2/V2);
  }
 
  sum3=0;
  for( q=0; q<N; q++)
    {
    sum3+=W[q];
    }
 
  sum4=0;
  for( a=0; a<N; a++)
    {
    sum4+=pow(W[a],2);
    }
 
 M = ((double)sum3/N);
 
 float sum5=0;
 for(int b=0; b<N; b++)
    {
     sum5+=(double)pow((W[b]-M),2);
    }
 Disp = ((double)1 / (N-1)) * sum5;
 
 TM = (double)V2/(V2-2);
 TDisp =(double)(2*V2*V2*(V1+V2-2)) /(double)(V1*((V2-2)*(V2-2))*(V2-4));
 
 float Wmin = 100;
 float Wmax = -100;
 
 for ( i = 0; i < N; i++)
    {
    if (W[i] < Wmin) Wmin = W[i];
    if (W[i] > Wmax) Wmax = W[i];
    }
 for(int t=1; t<=11;t++)
    {
    Mas[t]=0;
    }
 
 float P = (Wmax - Wmin) / 10.0;
 for(int E=1; E<=10; E++)
    {
    for ( i = 0; i < N; i++)
        {
         if (W[i] >= Wmin + (P * (E-1)) && W[i] < Wmin + (P * E)) Mas[E]++;
         }
    }
 
 float Z = (double)(TM-M)/((double)sqrt(TDisp/N));
 
 for( j=0;j<N;j++)
    {
    printf(" %3.5f", W[j]);
    }
 printf("\nЊ*вЋ¦Ё¤**ЁҐ=%5.5f \n„ЁбЇҐабЁп=%5.5f ", M,Disp);
 printf("\nЊ*вЋ¦Ё¤**ЁҐ’Ґ®а=%5.5f \n„ЁбЇҐабЁп’Ґ®а=%5.5f ", TM,TDisp);
 
 printf("\nZ=%f ", Z );
 
 for(j=1; j<=10; j++)
    {
    printf("\n[%3.6f ; %3.6f] %d ",Wmin + (P * (j-1)),Wmin + (P * j) ,  Mas[j]);
    }
 
 
 getch();
 }
Ну а отсюда взял как мат.ожидание и дисперсию находить.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2012, 20:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Генерация чисел. Пуассон. Код не фурычит (C++):

СТЭК не фурычит - C++
Привет! Такая проблема, решил написать стэк, в элементах которого лежат указатели на массив строк.Но что-то не так либо пишет мусор либо...

Слишком много элементов - vector не фурычит - C++
Есть много элементов, которые я пихаю в vector, а потом хочу отсортировать по одному признаку. Vector перестает фурычить - говорит, много...

Генерация чисел - C++
Доброго времени суток, не могли бы вы подсказать как выбрать рандомно число из двух чисел 2 и 4 и в диапозоне от 1 до 4 благодарю

генерация чисел - C++
написать прогу, которая генерирует последовательность из 10 случайных чисел в диапозоне от 1 до 10, выводит эти числа на экран и вычисляет...

Генерация чисел - C++
Вообщем мне нужно сгенерировать отрицательное вещественное число с 2 цифрами целой и 2 цифрами дробной части. Отрицательное ведь так...

Генерация чисел - C++
Нужно программа для генерации тризначных чисел и таких, что бы в этих числах них не было парных цифр. ТИпу, если число &quot;ХХХ&quot;, то &quot;Х&quot; не...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
30.09.2012, 21:07 #2
слишком много кода врятли ,кто то будет разбиратся, я могу помочь ,но пиши в ЛС
zss
Модератор
Эксперт С++
6363 / 5927 / 1922
Регистрация: 18.12.2011
Сообщений: 15,234
Завершенные тесты: 1
30.09.2012, 22:09 #3
Ошибок немерено.
Вот в таком виде она у меня хотя бы компилируется:
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
#include <math.h>
#include <stdio.h>
#include<stdlib.h>
#include <conio.h>
 
 
int random ( int xx, int u, int mm )
{
  /* function that creates random numbers ranging from 0 to m. */
    return (2*xx+u)%mm;
}
 
int* rand_poi ( int count )
{
    int store[100];
    int N,xx;
    int kk;
    int temp=21;
    double pre,nextt;
    double randd;
    N=xx=0;
    for(kk=0;kk<100;kk++) store[kk]=0;
    while(N<count)
    {
        temp=random(temp,1,100);
        randd=(double)temp/100;
        pre=nextt=randd;
        if(randd<exp(-2.)){ store[N++]=0; }
        else
        {
            pre=nextt;
            temp=random(temp,1,100);
            randd=(double)temp/100;
            nextt=nextt*randd;
            while( !( pre>=exp(-2.) && nextt<exp(-2.) ) )
            {
                xx++;
                pre=nextt;
                temp=random(temp,1,100);
                randd=temp/100;
                nextt=nextt*randd;
            }
            store[N++]=xx;
            xx=0;
        }
    }
    for(kk=0;kk<N;kk++)  printf("%d ",store[kk]);
    return store;
 
}
 
void main()
 {
 //clrscr();
 int N;
 int k=0;
 double *z, *W, x;
 int *Mas;
 double M, Disp, TeorM=2, TeorDisp=2;
 double sum1, sum2, sum3;
 double next=exp(-2.);
 double pred=1;
 
    printf("How many numbers do you want to generate?");
    scanf("%d",&N);
 
 W=new double[N];
 
 
 
// randomize();
 
 
  /*do 
 {
    k++;
    x = (random(1000)/1000.0);
    pred *=x;
 }  while (pred>next); 
 return (k-1);
*/
//========================================== 
 
  sum1=0;
  for( int q=0; q<N; q++)
    {
    sum1+=W[q];
    }
 
  sum3=0;
  for( int a=0; a<N; a++)
    {
    sum3+=pow(W[a],2.);
    }
 
 M = ((double)sum1/N);
 
 sum3=0;
 for(int b=0; b<N; b++)
    {
     sum3+=(double)pow((W[b]-M),2.);
    }
 Disp = ((double)1 / (N-1)) * sum3;
 
 //====================================================
 
 double Wmin = 100;
 double Wmax = -100;
 int i;
 for (i = 0; i < N; i++)
    {
    if (W[i] < Wmin) Wmin = W[i];
    if (W[i] > Wmax) Wmax = W[i];
    }
 for(int t=1; t<=11;t++)
    {
    Mas[t]=0;
    }
 
 double P = (Wmax - Wmin) / 10.0;
 for(int E=1; E<=10; E++)
    {
    for ( i = 0; i < N; i++)
        {
         if (W[i] >= Wmin + (P * (E-1)) && W[i] < Wmin + (P * E)) Mas[E]++;
        }
    }
 
 int j;
 for(j=0;j<N;j++)
    {
    printf(" %3.5f", W[j]);
    }
 printf("\nЊ*вЋ¦Ё¤**ЁҐ=%5.5f \n„ЁбЇҐабЁп=%5.5f ", M,Disp);
 printf("\nЊ*вЋ¦Ё¤**ЁҐ’Ґ®а=%5.5f \n„ЁбЇҐабЁп’Ґ®а=%5.5f ", TeorM,TeorDisp);
 for(j=1; j<=10; j++)
    {
    printf("\n[%3.6f ; %3.6f] %d ",Wmin + (P * (j-1)),Wmin + (P * j) ,  Mas[j]);
    }
 
 getch();
 }
При отладке программа слетает на 117 строчке
Mas[t]=0;
т.к. под Mas память не выделена.
(Вообще-то существует отладчик, чтобы отлавливать такие ошибки).

Кроме того:
!!!! Совсем неправильно в функции rand_poi возвращать store
(возвратиться адрес временного массива, который тут же удаляется).

И что за мода возводить в квадрат через функцию pow
(она возводит действительное число в действительную степень).
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
30.09.2012, 22:35 #4
Цитата Сообщение от Chikagovec Посмотреть сообщение
как-то неслучайно совсем
Вот так будет очень случайно:
код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <random>
using namespace std;
 
int random_int(int from_, int to_) // генерирует случайное число от from_ до to_
{
    random_device rd;
    mt19937 gen(rd());
    uniform_int_distribution<> dis(from_, to_);
    return dis(gen);
}
 
int main()
{
    int from = -10, to = 10;
    for (int i = 0; i<20; i++)
        cout<<random_int(from, to)<<" ";
    cout<<endl;
    system("pause");
    return 0;
}
Chikagovec
1 / 1 / 0
Регистрация: 18.02.2010
Сообщений: 20
01.10.2012, 08:25  [ТС] #5
Цитата Сообщение от zss Посмотреть сообщение
Ошибок немерено.
Вот в таком виде она у меня хотя бы компилируется:

При отладке программа слетает на 117 строчке
Mas[t]=0;
т.к. под Mas память не выделена.
(Вообще-то существует отладчик, чтобы отлавливать такие ошибки).

Кроме того:
!!!! Совсем неправильно в функции rand_poi возвращать store
(возвратиться адрес временного массива, который тут же удаляется).

И что за мода возводить в квадрат через функцию pow
(она возводит действительное число в действительную степень).
Как этот отладчик оживить?
А что тогда возвращать в функции rand_poi?
ну с квадратом ладно..
Спасибо за замечания!

Добавлено через 1 минуту
Цитата Сообщение от yuron_477 Посмотреть сообщение
Вот так будет очень случайно:
код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <random>
using namespace std;
 
int random_int(int from_, int to_) // генерирует случайное число от from_ до to_
{
    random_device rd;
    mt19937 gen(rd());
    uniform_int_distribution<> dis(from_, to_);
    return dis(gen);
}
 
int main()
{
    int from = -10, to = 10;
    for (int i = 0; i<20; i++)
        cout<<random_int(from, to)<<" ";
    cout<<endl;
    system("pause");
    return 0;
}
Спасибо! А можно так же но только случайно 1 и 0 выводить?
zss
Модератор
Эксперт С++
6363 / 5927 / 1922
Регистрация: 18.12.2011
Сообщений: 15,234
Завершенные тесты: 1
01.10.2012, 13:02 #6
Цитата Сообщение от Chikagovec Посмотреть сообщение
Как этот отладчик оживить?
А что тогда возвращать в функции rand_poi?
Надеюсь, пользуетесь MS Visual Studio.
Тогда отладчик у Вас уже есть.
Посмотрите команды меню "Debug".

Возвращать можно то же самое, но память под массив выделить динамически.
Только потом не забывайте ее удалять в вызывающей программе.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2012, 13:02
Привет! Вот еще темы с ответами:

Генерация чисел - C++
Помогите написать программу, а мучусь уже два часа. :) Нужно сгенерировать 30 трёхзначных чисел, и что бы в цифры этих чисел не были...

генерация чисел - C++
Скажите, пожалуйста, как сгенерировать случайным образом отрицательные числа?

Генерация случайных чисел - C++
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;clocale&gt; #include &lt;time.h&gt; #include &lt;stdlib.h&gt; using namespace std; int main ()...

Генерация случайных чисел - C++
Доброго времени суток ! Как генерировать случайное число например в диапазоне от 1 до 52 а потом исключить это число, и генерировать...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.10.2012, 13:02
Ответ Создать тему
Опции темы

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