-Каждый раз побеждают разные лошади. Там, внутри, какой-то механизм со
случайным выбором - примитивный, но достаточно эффективный...
Стивен Кинг "Нужные вещи"
|
Приветствую вас, уважаемые читатели!
Итак - у России "новый" президент. Вот и посмотрим, что из этого получится.
Я думаю, что некоторых чинуш, которые переусердствовали и обеспечили победу президенту в 99% по головке не погладят - всё уж слишком явно :-)
Хотя вот ведь что не может не пугать - ВСЕ(!) понимают, что эти выборы просто фарс и НИЧЕГО...
"товарищ, знай, пройдет она, эпоха
безудержной гласности, и комитет госбезопасности припомнит
наши имена!.. "
Так что не слишком удивляйтесь, если скоро весь руNet причешут в рамках политики президента и на всех сайтах будут торчать
баннеры - "ВСЁ ХОРОШО!" ;-/
В этом выпуске рассмотрим простенькую программку, которая проводит
"тестирование" функции, выдающей случайные числа. Данная программа вычисляет среднее значение, дисперсию, а так же распределение случайных чисел по пяти интервалам.
Ниже приведены исходные коды для файлов utils.сpp и testrnd.cpp . В файле
utils.сpp определена функция rnd() ; файл utils.h
здесь не приводится, т.к. там всего лишь объявлена функция rnd() и определён тип uint , который на самом деле - unsigned int .
============================ utils.сpp ============================
//////////////////////////////////////////////////////////////////////
//
// utils.cpp
// certain utilitys
//
//
// XIII
//////////////////////////////////////////////////////////////////////
#ifndef _UTILS_CPP_
#define _UTILS_CPP_
#include "utils.h"
int rnd(int number)
{// for generate random numbers: [0..number)
#ifdef _WIN32
int num;
num=(int)((double)rand() / ((double)RAND_MAX + 1) * number);
//## change it for more good !!!!!
return num;
#else
// read random numbers from /dev/urandom
// for store files descriptors
static int dev_urandom=-1;
int bytes;
uint data;
// errors flags
bool urandom_error=false;
bool read_error=false;
if(dev_urandom==-1)
{
dev_urandom=open("/dev/urandom",O_RDONLY);
if(dev_urandom==-1)
urandom_error=true;
}
if(!urandom_error)
{
bytes=read(dev_urandom,&data,sizeof(data));
if(bytes!=sizeof(data))
read_error=true;
else
{
data=data%(number+1);
}
}
// nothing dont work
if(urandom_error || read_error)
{
//## change it for more good !!!!!
data=(int)((double)rand() / ((double)RAND_MAX + 1) * number);
}
return data;
#endif //#ifdef _WIN32
}
#endif //#ifndef _UTILS_CPP_
|
============================ testrnd.cpp ============================
//////////////////////////////////////////////////////////////////////
//
// testrnd.cpp
// for test rnd() function
//
//
// XIII
//////////////////////////////////////////////////////////////////////
#ifndef _TESTRND_CPP_
#define _TESTRND_CPP_
#include <stdio.h>
#include <math.h>
#include "utils.h" //for rnd()
// number of intervals
#define _N_ 5
#define DEFAULT_MAX_RND 10
const char prog_name[]="testrnd";
int main(int argc,char *argv[])
{
float *RndData; // store random numbers
int NumberOfIterations;
uint MaxRnd;
int i; // counter
float x;
float average;
int r1=0,r2=0,r3=0,r4=0,r5=0; // for calculate number of random numbers in various intervals
if(argc<2)
{
printf("Usage:\n%s <number of iterations> <random max(divisible on 5)>\n",prog_name);
return -1;
}
NumberOfIterations=atoi(argv[1]);
if(argc<3)
MaxRnd=DEFAULT_MAX_RND;
else
MaxRnd=atoi(argv[2]);
if(NumberOfIterations==0 || MaxRnd==0)
{
printf("Number of iterations and random max must be more than zero!\n");
return 2;
}
// print parameters
printf("parameters:\nNumber of iterations: %d\nrandom max: %d\n",NumberOfIterations,MaxRnd);
average=0;
RndData=new float[NumberOfIterations];
if(RndData==NULL)
{
printf("Cant allocate memory for RndData !\n");
return 3;
}
for(i=0;i<NumberOfIterations;i++)
{
//\/\/\/\/\/\/\/\/\//
x=rnd(MaxRnd+1);
//\/\/\/\/\/\/\/\/\//
RndData[i]=x;
average+=x;
// calculate number of random numbers in various intervals
if(x<MaxRnd/5)
r1++;
else
{
if(x<2*MaxRnd/5)
r2++;
else
{
if(x<3*MaxRnd/5)
r3++;
else
{
if(x<4*MaxRnd/5)
r4++;
else
{
if(x<=MaxRnd)
r5++;
}
}
}
}
}
average/=NumberOfIterations;
//---------- calculate dispersion ---------------
float Dispersion=0,fx=0;
for(i=0;i<NumberOfIterations;i++)
{
fx+=(RndData[i]-average)*(RndData[i]-average);
// printf("%1.3f\n",RndData[i]);
}
Dispersion=fx/(NumberOfIterations-1);
Dispersion=sqrt(Dispersion);
//---------- calculate dispersion end ------------
printf("-------------------\n");
printf("Average:\t %1.3f\n",average);
printf("Dispersion:\t %1.3f\n",Dispersion);
printf("<%d:\t\t %d\n",MaxRnd/5,r1);
printf("<%d:\t\t %d\n",2*MaxRnd/5,r2);
printf("<%d:\t\t %d\n",3*MaxRnd/5,r3);
printf("<%d:\t\t %d\n",4*MaxRnd/5,r4);
printf("<%d:\t\t %d\n",MaxRnd,r4);
printf("-------------------\n");
printf("Number of intervals (n): %d\n",_N_);
printf("1/n:\t\t %1.3f\n",(float)1/_N_);
printf("p1:\t\t %1.3f\n",(float)r1/NumberOfIterations);
printf("p2:\t\t %1.3f\n",(float)r2/NumberOfIterations);
printf("p3:\t\t %1.3f\n",(float)r3/NumberOfIterations);
printf("p4:\t\t %1.3f\n",(float)r4/NumberOfIterations);
printf("p5:\t\t %1.3f\n",(float)r5/NumberOfIterations);
printf("-------------------\n");
delete []RndData;
RndData=NULL;
return 0;
}
#endif //#ifndef _TESTRND_CPP_
|
По-моему всё просто - программа использует массив, расположенный в динамической памяти, в который записывает случайные числа(для того, чтобы в будущем посчитать дисперсию) и заодно считает в какой из интервалов попадает число(это делает такая корявая последовательность if-else ).
В следующем выпуске я рассчитываю перейти к рассмотрению интересной(и во многом философской) модели.
Удачи!
|