Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема с прогой


Автор: Syrex 28.2.2006, 15:19
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

double vozd()
{
double s=0;
for(int i=0;i<=11;i++)
{
s=s+0.04165*(-0.5+((double)rand()/(double)RAND_MAX));
}
return s;
}

int main()
{
char c=0;
clrscr();
while(c!=10)
{
printf("Vozd=%f\n",vozd());//выдает всегда одинаковые значения при перезапуске проги
c++;
}
getch();
return 0;
}


Автор: comcon1 28.2.2006, 15:22
Естественно. Генератор случайных чисел нужно инициализировать числовым значением.
Чтобы оно менялось - инициализируй от времени.

Если у тебя POSIX-компилятор - используй rand48, он там частенько есть.

Если у тебя LINUX - читай из /dev/random - там генератор случайностей, инициализированный от флуктуаций температуры процессора.

Ах, забыл написать, в простом случае инициализация srand(int seed)

Автор: Dov 28.2.2006, 15:41
Код

...
#include <time.h>
...

int main()
{
    srand((unsigned)time(NULL));
        ...  
}

Автор: Syrex 28.2.2006, 15:50
Ну допустим я поставлю
Код

int main()
{
char c=0;
srand(time(NULL)); // добавил


ВСЕ РАВНО ВЫВОДИТ (-0,25) ВО ВСЕХ 10 ЦИКЛАХ

Автор: Dov 28.2.2006, 16:02
Запустил 2 раза подряд, вот результаты:

Vozd=-0.019900
Vozd=-0.017569
Vozd=-0.000719
Vozd=0.000943
Vozd=0.008708
Vozd=-0.014246
Vozd=-0.046480
Vozd=0.016029
Vozd=-0.025492
Vozd=0.089039
Press any key to continue


Vozd=0.002602
Vozd=-0.066045
Vozd=-0.022252
Vozd=0.068616
Vozd=0.048177
Vozd=0.006608
Vozd=-0.030189
Vozd=0.030809
Vozd=0.066176
Vozd=0.052914
Press any key to continue

Автор: Syrex 28.2.2006, 16:13
Компилю в Борланд С++ 5.02 код:
Код

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

double vozd()
{
   double s=0;
   for(int i=0;i<=11;i++)
   {
      s=s+0.04166666665*(-0.5+rand()/RAND_MAX);
   }
   return s;
}

int main()
{
   char c=0;
   srand(time(NULL));
   clrscr();

   while(c!=10)
   {
      printf("Vozd=%f\n",vozd());
      c++;
   }
   getch();
   return 0;
}

И получаю на выходе:
Vozd=-0.250000
Vozd=-0.250000
Vozd=-0.250000
Vozd=-0.250000
Vozd=-0.250000
Vozd=-0.250000
Vozd=-0.250000
Vozd=-0.250000
Vozd=-0.250000
Vozd=-0.250000

Автор: comcon1 28.2.2006, 16:17
rand()/RAND_MAX все время будет давать 0. Сделай так:
Код

 (double)( rand() ) / RAND_MAX

и скажи, че получилось.

Потому что rand() выдает int. Хочешь дробные - юзай лучше random() и srandom().

Автор: Dov 28.2.2006, 16:19
так сделай
Код
(double)rand()


Автор: Syrex 28.2.2006, 16:20
Спасибо - comcon1теперь все заработало. А зачем тут Double??

Автор: comcon1 28.2.2006, 16:25
Потому что оператор "/" для чисел int и int делает деление с округлением в меньшую сторону.
Дальше сам додумаешься.

Автор: Syrex 28.2.2006, 16:31
АГА. Огромное тебе спс за помошь!

Автор: comcon1 28.2.2006, 16:37
smile Не забудь закрыть тему. А то все забывают.

Автор: Syrex 28.2.2006, 17:36
А как закрыть?? Просто написать

тема закрыта

Модератор:
У тебя как автора темы должна быть ссылка "пометить как решенный" над быстрым ответом.
Это на будущее. Тему закрыла.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)