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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> rand(), постоянное увеличение генерируемого числа, rand() увеличивает число 
V
    Опции темы
awesome
Дата 20.10.2010, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

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



проблема в следующем: при запуске программы получается случайное число, при последующих запусках это число постоянно увеличивается. Не могу понять в чем может быть проблема...
Код

#include <iostream.h>
#include <stdlib.h>
#include <time.h>
double new_random(float p, int n_pack);
void main(void)
{
    double intensity_upstream = 0.4;
    int number_abonents = 8;
    float p = (float)intensity_upstream / number_abonents;
    double c = new_random(p, 0);
        cout << c << endl;

}

    double new_random(float p, int n_pack)
    {    
        srand((unsigned)time(NULL));
        int tmp = rand() % 1000 + 1;    
        return (double)tmp / 1000;
    }


Это сообщение отредактировал(а) awesome - 20.10.2010, 00:24
PM MAIL   Вверх
Crafty
Дата 20.10.2010, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 2
Всего: 14



awesome, да вроде всё нормально работает. Попробуйте тут онлайн компилятор

Это сообщение отредактировал(а) Crafty - 20.10.2010, 00:32
PM MAIL   Вверх
awesome
Дата 20.10.2010, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

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



хм...странно. по ссылке действительно работает. пишу в 2006 студии.
PM MAIL   Вверх
boostcoder
Дата 20.10.2010, 00:50 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(awesome @  20.10.2010,  00:37 Найти цитируемый пост)
по ссылке действительно работает.

дело в том, что компилятор по ссылке, реализован на линукс. а в линукс, реализация функции rand() сильно отличается от тех, что реализованы в компиляторах для вендаус.
а по хорошему, лучше использовать boost.random.
PM WWW   Вверх
awesome
Дата 20.10.2010, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

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



boostcoder, можно ли добиться корректной работы без применения этой библиотеки?
PM MAIL   Вверх
Crafty
Дата 20.10.2010, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 2
Всего: 14



Можно сделать что-то наподобие этого
Код

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

double new_random(float p, int n_pack);
int main()
{
    double intensity_upstream = 0.4;
    int number_abonents = 8;
    float p = (float)intensity_upstream / number_abonents;
    double c = new_random(p, 0);
        cout << c << endl;
}
    double new_random(float p, int n_pack)
    {    
        srand((unsigned)time(NULL));
        int d = rand() + 1;
        int tmp = d * rand() % 1000 + 1;    
        return (double)tmp / 1000;
    }



Но лучше использовать какую-нибудь стороннюю библиотеку.
PM MAIL   Вверх
awesome
Дата 20.10.2010, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

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



Crafty, спасибо за помощь!
PM MAIL   Вверх
awesome
Дата 20.10.2010, 03:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

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



так, теперь все работает нормально, но если попытаться вывести сгенерированное несколько раз, то получается одинаковое число.
Код

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
double new_random(float p, int n_pack);
int main()
{
    double intensity_upstream = 0.4;
    int number_abonents = 8;
    float p = (float)intensity_upstream / number_abonents;
    for(int i = 0; i < 20; i++)
   {
       double c = new_random(p, 0);
        cout << c << endl;
 }
}
    double new_random(float p, int n_pack)
    {    
        srand((unsigned)time(NULL));
        int d = rand() + 1;
        int tmp = d * rand() % 1000 + 1;    
        return (double)tmp / 1000;
    }

PM MAIL   Вверх
Crafty
Дата 20.10.2010, 04:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 2
Всего: 14



Цитата

void srand ( unsigned int seed );
Two different initializations with the same seed, instructs the pseudo-random generator to generate the same succession of results for the subsequent calls to rand in both cases.

То есть srand нужно вызывать только один раз, так как семя( наше time(NULL) ) у нас не меняется за столь короткое время.
Тут подробней srand
Код

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
double new_random(float p, int n_pack);
int main()
{
    double intensity_upstream = 0.4;
    int number_abonents = 8;
    float p = (float)intensity_upstream / number_abonents;
    srand((unsigned)time(NULL));
    for(int i = 0; i < 20; i++)
   {
       double c = new_random(p, 0);
        cout << c << endl;
 }
}
    double new_random(float p, int n_pack)
    {    
        int d = rand() + 1;
        int tmp = d * rand() % 1000 + 1;    
        return (double)tmp / 1000;
    }


Тут подробней srand
PM MAIL   Вверх
awesome
Дата 20.10.2010, 04:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

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



Crafty, еще раз спасибо большое!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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