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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция srand() 
:(
    Опции темы
Ufyljy
Дата 29.10.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Можете рассказать подробно об этой функции, т.к. она напрямую связана с функцией rand();
Например, константа time t; служит для вывода в генератор времени.
Есть ли какие-нибудь константы, которые позволяют выводить случайные символы, как можно настраивать диапазон значений?
PM MAIL   Вверх
Lazin
Дата 29.10.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



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

Генерируй случайные числа в диапазоне 32 - 255, и приводи их к unsigned char
PM MAIL Skype GTalk   Вверх
bsa
Дата 29.10.2007, 13:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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.
PM   Вверх
Ufyljy
Дата 30.10.2007, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А нельзя сделать, чтобы функция генерировала случайные символы в заданном диапазоне?
PM MAIL   Вверх
reat
Дата 30.10.2007, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

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

PM MAIL ICQ GTalk   Вверх
Ln78
Дата 30.10.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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 раза чаще, чем остальные

Это сообщение отредактировал(а) Ln78 - 30.10.2007, 12:42
PM MAIL   Вверх
bsa
Дата 30.10.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

Ты мой пост плохо читал видимо. Я же написал формулу, по которой можно создать функцию генерации в заданном диапазоне (от k до n).
PM   Вверх
Ufyljy
Дата 31.10.2007, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ага, спасибо, извините, что не заметил

Это сообщение отредактировал(а) Ufyljy - 31.10.2007, 10:23
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.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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