Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 18.02.2010
Сообщений: 20
1

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Господа, кому несложно покопаться в коде, помогите понять, где тут ошибки? Программа запускается, число выборки ввожу и всё, вылетает. Я в этом деле нуб, так что буду рад самой жесткой критике.
Само задание выглядит примерно так: Генерац-я псевдо чисел. Неуниверсальный метод. Пуассоновское распределение, где М=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();
 }
Ну а отсюда взял как мат.ожидание и дисперсию находить.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.09.2012, 20:38
Ответы с готовыми решениями:

Генерация массива случайных чисел код выдаёт неправильный результат
Вот код : #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;cstdlib&gt;...

Пуассон-подобное распределение
Распределение Пуассона предполагает, что интенсивность не меняется с течением времени и является...

Пуассон для матлаба
Здравствуйте! Подскажите, пожалуйста, возможно у кого-то есть код экранированного уравнения...

Генерация случайных чисел с учётом уже имеющихся чисел. (C++ Builder 6)
Здравствуйте. Появилось желание создать программу генерации случайных чисел с учётом уже имеющихся...

5
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
30.09.2012, 21:07 2
слишком много кода врятли ,кто то будет разбиратся, я могу помочь ,но пиши в ЛС
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,719
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
(она возводит действительное число в действительную степень).
0
1458 / 795 / 257
Регистрация: 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;
}
0
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 выводить?
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,719
01.10.2012, 13:02 6
Цитата Сообщение от Chikagovec Посмотреть сообщение
Как этот отладчик оживить?
А что тогда возвращать в функции rand_poi?
Надеюсь, пользуетесь MS Visual Studio.
Тогда отладчик у Вас уже есть.
Посмотрите команды меню "Debug".

Возвращать можно то же самое, но память под массив выделить динамически.
Только потом не забывайте ее удалять в вызывающей программе.
0
01.10.2012, 13:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.10.2012, 13:02
Помогаю со студенческими работами здесь

Генерация случайных чисел от -10 до 10 и подсчет сколько в этой последовательности чисел происходило смен знака
Компьютер последовательно генерирует 100 случайных чисел в диапазоне от -10 до 10.Подсчитать...

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

Микрофон не фурычит
Заранее прошу прощения за тупость, но я не знаю что нужно сделать, а подсказать никто не может. ...

Не фурычит usb 2.0
Привет всем! Недавно появилась такая проблема - стал вылетать синей экран. Код ошибки 0x000000FE...

Видюха не фурычит
когда захожу в игру пишит что драйвер directx не найден хотя я их уже 4 штук установил и не один из...

toggle не фурычит
Добрый день! Прохожу видеокурс по яве и jquery. Приведен следующий код: &lt;div...


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

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