Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с прогой, Не работает рандом 
V
    Опции темы
Syrex
Дата 28.2.2006, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 9.2.2006
Где: Москва

Репутация: нет
Всего: 1



#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;
}


PM MAIL ICQ   Вверх
comcon1
Дата 28.2.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Естественно. Генератор случайных чисел нужно инициализировать числовым значением.
Чтобы оно менялось - инициализируй от времени.

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

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

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

Это сообщение отредактировал(а) comcon1 - 28.2.2006, 15:23


--------------------
PM MAIL   Вверх
Dov
Дата 28.2.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Код

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

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



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Syrex
Дата 28.2.2006, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 9.2.2006
Где: Москва

Репутация: нет
Всего: 1



Ну допустим я поставлю
Код

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


ВСЕ РАВНО ВЫВОДИТ (-0,25) ВО ВСЕХ 10 ЦИКЛАХ
PM MAIL ICQ   Вверх
Dov
Дата 28.2.2006, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Запустил 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



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Syrex
Дата 28.2.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 9.2.2006
Где: Москва

Репутация: нет
Всего: 1



Компилю в Борланд С++ 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
PM MAIL ICQ   Вверх
comcon1
Дата 28.2.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



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

 (double)( rand() ) / RAND_MAX

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

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

Это сообщение отредактировал(а) comcon1 - 28.2.2006, 16:19


--------------------
PM MAIL   Вверх
Dov
Дата 28.2.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



так сделай
Код
(double)rand()




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Syrex
Дата 28.2.2006, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 9.2.2006
Где: Москва

Репутация: нет
Всего: 1



Спасибо - comcon1теперь все заработало. А зачем тут Double??
PM MAIL ICQ   Вверх
comcon1
Дата 28.2.2006, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Потому что оператор "/" для чисел int и int делает деление с округлением в меньшую сторону.
Дальше сам додумаешься.


--------------------
PM MAIL   Вверх
Syrex
Дата 28.2.2006, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 9.2.2006
Где: Москва

Репутация: нет
Всего: 1



АГА. Огромное тебе спс за помошь!
PM MAIL ICQ   Вверх
comcon1
Дата 28.2.2006, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



smile Не забудь закрыть тему. А то все забывают.


--------------------
PM MAIL   Вверх
Syrex
Дата 28.2.2006, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 9.2.2006
Где: Москва

Репутация: нет
Всего: 1



А как закрыть?? Просто написать

тема закрыта

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


Это сообщение отредактировал(а) Earnest - 28.2.2006, 17:51
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.