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

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

Восстановить пароль Регистрация
 
Chikagovec
1 / 1 / 0
Регистрация: 18.02.2010
Сообщений: 20
30.09.2012, 20:38     Генерация чисел. Пуассон. Код не фурычит #1
Доброго времени суток.
Господа, кому несложно покопаться в коде, помогите понять, где тут ошибки? Программа запускается, число выборки ввожу и всё, вылетает. Я в этом деле нуб, так что буду рад самой жесткой критике.
Само задание выглядит примерно так: Генерац-я псевдо чисел. Неуниверсальный метод. Пуассоновское распределение, где М=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++
генерация чисел C++
Генерация чисел C++
C++ генерация чисел
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
30.09.2012, 21:07     Генерация чисел. Пуассон. Код не фурычит #2
слишком много кода врятли ,кто то будет разбиратся, я могу помочь ,но пиши в ЛС
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,178
Завершенные тесты: 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
 Аватар для DiffEreD
1420 / 757 / 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
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,178
Завершенные тесты: 1
01.10.2012, 13:02     Генерация чисел. Пуассон. Код не фурычит #6
Цитата Сообщение от Chikagovec Посмотреть сообщение
Как этот отладчик оживить?
А что тогда возвращать в функции rand_poi?
Надеюсь, пользуетесь MS Visual Studio.
Тогда отладчик у Вас уже есть.
Посмотрите команды меню "Debug".

Возвращать можно то же самое, но память под массив выделить динамически.
Только потом не забывайте ее удалять в вызывающей программе.
Yandex
Объявления
01.10.2012, 13:02     Генерация чисел. Пуассон. Код не фурычит
Ответ Создать тему
Опции темы

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