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


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

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

Автор: Crafty 20.10.2010, 00:32
awesome, да вроде всё нормально работает. Попробуйте тут http://liveworkspace.org/code/006e6f35b4d0e7e9864b7a79208f318f

Автор: awesome 20.10.2010, 00:37
хм...странно. по ссылке действительно работает. пишу в 2006 студии.

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

дело в том, что компилятор по ссылке, реализован на линукс. а в линукс, реализация функции rand() сильно отличается от тех, что реализованы в компиляторах для вендаус.
а по хорошему, лучше использовать http://www.boost.org/doc/libs/1_44_0/libs/random/index.html.

Автор: awesome 20.10.2010, 01:08
boostcoder, можно ли добиться корректной работы без применения этой библиотеки?

Автор: Crafty 20.10.2010, 02:25
Можно сделать что-то наподобие этого
Код

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



Но лучше использовать какую-нибудь стороннюю библиотеку.

Автор: awesome 20.10.2010, 02:33
Crafty, спасибо за помощь!

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

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

Автор: Crafty 20.10.2010, 04: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) ) у нас не меняется за столь короткое время.
Тут подробней http://www.cplusplus.com/reference/clibrary/cstdlib/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;
    }


Тут подробней http://www.cplusplus.com/reference/clibrary/cstdlib/srand/

Автор: awesome 20.10.2010, 04:21
Crafty, еще раз спасибо большое!

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