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


Автор: Ufyljy 29.10.2007, 11:33
Можете рассказать подробно об этой функции, т.к. она напрямую связана с функцией rand();
Например, константа time t; служит для вывода в генератор времени.
Есть ли какие-нибудь константы, которые позволяют выводить случайные символы, как можно настраивать диапазон значений?

Автор: Lazin 29.10.2007, 13:02
Цитата(Ufyljy @  29.10.2007,  11:33 Найти цитируемый пост)
Есть ли какие-нибудь константы, которые позволяют выводить случайные символы, как можно настраивать диапазон значений? 

Генерируй случайные числа в диапазоне 32 - 255, и приводи их к unsigned char

Автор: bsa 29.10.2007, 13:53
Ufyljy
Цитата(man srand)
       The  rand()  function  returns  a  pseudo-random  integer between 0 and
       RAND_MAX.

       The srand() function sets its argument as the seed for a  new  sequence
       of  pseudo-random  integers  to be returned by rand().  These sequences
       are repeatable by calling srand() with the same seed value.

       If no seed value is provided,  the  rand()  function  is  automatically
       seeded with a value of 1.

       The function rand() is not reentrant or thread-safe, since it uses hid-
       den state that is modified on each call.  This might just be  the  seed
       value to be used by the next call, or it might be something more elabo-
       rate.  In order to get reproducible behavior in a threaded application,
       this  state  must  be made explicit.  The function rand_r() is supplied
       with a pointer to an unsigned int, to be used as state.  This is a very
       small  amount  of  state, so this function will be a weak pseudo-random
       generator.  Try drand48_r(3) instead.
Другими словами, rand() генерирует псевдослучайные числа на основании определенной формулы (например, rnd = (seed = a*seed + b) >> 16, где a - некое простое число (помним со времен школы, что это такое?), b - некое нечетное число). В этой формуле помимо пары констант фигурирует одна переменная - seed. После каждого вызова rand() эта seed принимает определенное значение (например, результат вызова). Функция srand() записывает в seed то, что ты передал ей в качестве параметра.
Изначально seed равна какому-то определенному числу. Поэтому вызов rand() каждый раз при старте программы будет выдавать одну и ту же последовательность чисел. Чтобы этого избежать, при старте программы однократно вызывают srand() и передают ей текущее время в секундах. Это делается так:
Код
srand(time(0));

Если тебе надо получить случайное вещественное (например) число от k до n, то надо вычислять по формуле:
Код
double rnd = k + (n-k) * rand() / ((double)RAND_MAX);

time_t - это не константа, это тип. Тип переменной, хранящей время в секундах от начала Эпохи Unix (01.01.1970). А функция time() возвращает текущее универсальное координатное время (UTC) в секундах от начала Эпохи Unix.

Автор: Ufyljy 30.10.2007, 09:04
А нельзя сделать, чтобы функция генерировала случайные символы в заданном диапазоне?

Автор: reat 30.10.2007, 12:24
Код

int rangeMin = 123;
int rangeMax = 635;
int random = rangeMin + (rand() % (rangeMax - rangeMin));

Автор: Ln78 30.10.2007, 12:41
Ufyljy, пример из справки VS:
Код

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

int main( void )
{
   int i;
   
   // Seed the random-number generator with current time so that
   // the numbers will be different every time we run.
   //
   srand( (unsigned)time( NULL ) );

   // Display 10 numbers.
   for( i = 0;   i < 10;i++ )
      printf( "  %6d\n", rand() );

  printf("\n");

  // Usually, you will want to generate a number in a specific range,
  // such as 0 to 100, like this:
  {
     int RANGE_MIN = 0;
     int RANGE_MAX = 100;
     for (i = 0;    i < 10; i++ )
      {
         int rand100 = (((double) rand() / 
                         (double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
         printf( "  %6d\n", rand100);
      }
  }
}


reat, Ваше решение не совсем верное: числа могут быть распределены неравномерно.  Чтобы проще понять почему, допустим, что rand генерирует в диапазоне от 1 до 7, а нужно чтобы было от 1 до 6. Если воспользоваться почти Вашей формулой (т.е. добавить забытый +1), то получится, что 1 будет выпадать в 2 раза чаще, чем остальные

Автор: bsa 30.10.2007, 15:18
Цитата(Ufyljy @ 30.10.2007,  09:04)
А нельзя сделать, чтобы функция генерировала случайные символы в заданном диапазоне?

Ты мой пост плохо читал видимо. Я же написал формулу, по которой можно создать функцию генерации в заданном диапазоне (от k до n).

Автор: Ufyljy 31.10.2007, 10:21
Ага, спасибо, извините, что не заметил

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