Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Какой тип данных возвращает rand() в WinAVR?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
-=Женек=-
Какой тип данных возвращает rand() в WinAVR?
int? unsigned int?

Я поэкспериментировал и мне кажется, что диапазон значений - от 0 до 32768. Я прав?

Мне бы получить 16-ти битное случайное число. Как?
makc
Цитируя хеадер:
Код
/** Highest number that can be generated by rand(). */
#define    RAND_MAX 0x7FFF

/**
     The rand() function computes a sequence of pseudo-random integers in the
     range of 0 to \c RAND_MAX (as defined by the header file <stdlib.h>).

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

     If no seed value is provided, the functions are automatically seeded with
     a value of 1.

     In compliance with the C standard, these functions operate on
     \c int arguments.  Since the underlying algorithm already uses
     32-bit calculations, this causes a loss of precision.  See
     \c random() for an alternate set of functions that retains full
     32-bit precision.
*/
extern int rand(void);
-=Женек=-
Я английский знаю со словарем. Смысл написанного понял в общих чертах. Разницу между rand и srand не понял. Просьба знающих пояснить.



Я так понял 7FFF - это 15 битное число, а мне надо 16 бит.
Я поставил в теле программы после включения stdlib строку #define RAND_MAX 0xFFFF - не помогло - не генерит больше 7FFF
-=Женек=-
Короче говоря, мне нужно получить число в диапазоне от 0 до 65535
makc
Цитата(-=Женек=- @ Sep 17 2006, 22:53) *
Я английский знаю со словарем. Смысл написанного понял в общих чертах. Разницу между rand и srand не понял. Просьба знающих пояснить.


rand - функция получения следующего псевдослучайного значения. srand - функция инициализации (задания стартового значения) генератора псевдослучайной последовательности.



Цитата
Я так понял 7FFF - это 15 битное число, а мне надо 16 бит.


Это может быть и 32-х битным числом. ;) Но в данном случае это максимальное положительное число типа int.

Цитата
Я поставил в теле программы после включения stdlib строку #define RAND_MAX 0xFFFF - не помогло - не генерит больше 7FFF


Библиотека уже скомпилирована с учетом вышеуказанной константы. Так что Ваше переопределение дефайна ничего не даст. Можете поступить таким образом:
Код
unsigned value;
value = (((unsigned)rand())<<1)+rand();


Это будет 16-и разрядное беззнаковое целое число с псевдослучайным значением.
-=Женек=-
ОК! Спасибо. Работает.

Но если вам не трудно, не могли бы вы на пальцах объяснить что делает выражение (((unsigned)rand())<<1)+rand();


Такие вещи проще придумать, чем разобраться в них

srand - функция инициализации (задания стартового значения) генератора псевдослучайной последовательности.


для чего это нужно практически? Что будет есил использовать/ не использовать эту функцию?
vooon
Цитата
Но если вам не трудно, не могли бы вы на пальцах объяснить что делает выражение (((unsigned)rand())<<1)+rand();


1. вызываем функцию rand(), которая возвращает число типа signed int
2. переводим это число в беззнаковое число
3. сдвигаем влево не один бит (получаем 16-ый бит)
4. вызываем rand(), и прибавляем возвращенное значение

вроде так smile.gif
_artem_
так как rand() возврашает целое число в диапазане от 0 до 0х7fff, при прямом переводе его из signed в unsigned
старший бит случайного числа будет всегда равным нулю, что не есть хорошо для случайной последовательности.
Используя данную функцию :

(((unsigned)rand())<<1)+rand();

вместо rand() Вы сможете получить заполнение этого пустого старшего бита. То есть

Код
unsigned int Ваш_rand(void)
{
    return (((unsigned)rand())<<1)+ rand();
}


буфдет генерировать unsigned integer от 0 до 0хffff.


"srand - функция инициализации (задания стартового значения) генератора псевдослучайной последовательности."

так как генератор случайной последовательности невозможно сделать без элемента случайности) (который отсутствует в стандарте языка C ), случайную последовательность получают путем приближения допустим полиномиальными функциями. Посредством использования srand() (с Вашим уникальным значением аргумента) Вы добьетесь того что Ваша последовательность будет отличаться от последовательности функции srand() на другой программе.
makc
Цитата(_artem_ @ Sep 17 2006, 23:58) *
так как генератор случайной последовательности невозможно сделать без элемента случайности) (который отсутствует в стандарте языка C ), случайную последовательность получают путем приближения допустим полиномиальными функциями. Посредством использования srand() (с Вашим уникальным значением аргумента) Вы добьетесь того что Ваша последовательность будет отличаться от последовательности функции srand() на другой программе.


Все правильно, только нужно добавить, что получаемая псевдослучайная последовательность будет обладать некоторой периодичность и, как следствие, предсказуемостью. srand() несколько помогает, но он лишь сдвигает начало этой последовательности, в то время как период остается прежним.


Цитата(-=Женек=- @ Sep 17 2006, 23:21) *
srand - функция инициализации (задания стартового значения) генератора псевдослучайной последовательности.


для чего это нужно практически? Что будет есил использовать/ не использовать эту функцию?


Если не будете делать srand() или будете делать srand( _константа_ ), то в результате вызова rand() будете получать одни и те же значения. Проблема только в этом.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.