#1 06.04.11 00:38
[С++] - ошибка в программе
для сгенерированной случайной последовательности z[i] проводится проверка подчинения равномерному распределению, с помощью критерия согласия χ2-Пирсона.
Код::
Для проверки гипотезы о том, что сгенерированная последовательность подчиняется равно-мерному распределению, можно использовать критерий согласия χ2-Пирсона. Сначала отрезок, содержащий числа, которые могут быть смоделированы, разбивают на K интервалов (интервалы обычно выбирают равной длины) и считают, сколько элементов последо-вательности, длина которой N, попадает в каждый интервал (vi).Пусть M – максимально возмож-ный элемент в последовательности длиной N, тогда если M < 10, то K = M, иначе K ≈ 5∙lg N. Затем вычисляют статистику критерия по формуле: S = N * сумма по K (((vi/N))-Pi)^2)/Pi где Pi – теоретическая вероятность попадания в i-й интервал (для равномерного распределения Pi = 1 / K, если интервалы равной длины).
Код::
#include "stdafx.h"
#include <conio.h>
#include <math.h>
#define N 50 // мощность первого алфавита
double sqr(double x){
return x*x;}
void main()
{
int z[200];
int Ki=(int)ceil(5*(log((double) N)/log(10.0))); //количество интервалов
float M=N/Ki; //длина интервала
int *v=new int[Ki]; //количество элементов в каждом интервале
for (int i=0; i<Ki; i++)
z[i]=M;
double S=0;
for(int i1=0; i1<Ki; ++i1)
{
S+=sqr((double)(v[i1]/N-1/Ki)/(1/Ki)); //вычисляем критерий
}
printf ("\n" "S*= %f", S);
getch();
}выдает S*= 1.#INF00 ???
Исправлено Aguero (06.04.11 00:40)
Offline
#2 06.04.11 01:13
Re: [С++] - ошибка в программе
Aguero написал(а):
printf ("\n" "S*= %f", S);
а так можно? мб
Код::
printf ("\nS*= %f", S);Исправлено Fire Stream (06.04.11 01:14)
Offline
#8 06.04.11 20:07
Re: [С++] - ошибка в программе
А мои сообщения видимо проигнорировал? Я вот, например, продолжаю утверждать, что 1/Ki = 0 при Ki = 9. Хочешь проверить - исполни этот код и погляди чему будут равны k1 и k2:
Код::
double k1 = 1/Ki; double k2 = 1.0/Ki;
Почувствуй разницу, что называется.
Исправлено Draloskop (06.04.11 20:19)
Offline
#10 06.04.11 22:25
#11 06.04.11 22:26
#12 07.04.11 12:36
#13 08.04.11 17:24
Re: [С++] - ошибка в программе
int *v=new int[Ki]; //количество элементов в каждом интервале
for (int i=0; i<Ki; i++)
z[i]=M;
вот это заменяю на это
int *v=new int[Ki]; //количество элементов в каждом интервале
for (int i=0; i<Ki; i++)
pp = v[(((int)z[i]/(int)M))];
printf("%f", pp);
в чем может быть ошибка?...
Offline

