реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Какой тип данных возвращает rand() в WinAVR?
-=Женек=-
сообщение Sep 17 2006, 17:46
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



Какой тип данных возвращает rand() в WinAVR?
int? unsigned int?

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

Мне бы получить 16-ти битное случайное число. Как?
Go to the top of the page
 
+Quote Post
makc
сообщение Sep 17 2006, 17:51
Сообщение #2


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Цитируя хеадер:
Код
/** 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);


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Sep 17 2006, 18:53
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



Я английский знаю со словарем. Смысл написанного понял в общих чертах. Разницу между rand и srand не понял. Просьба знающих пояснить.



Я так понял 7FFF - это 15 битное число, а мне надо 16 бит.
Я поставил в теле программы после включения stdlib строку #define RAND_MAX 0xFFFF - не помогло - не генерит больше 7FFF
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Sep 17 2006, 19:07
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



Короче говоря, мне нужно получить число в диапазоне от 0 до 65535
Go to the top of the page
 
+Quote Post
makc
сообщение Sep 17 2006, 19:10
Сообщение #5


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Цитата(-=Женек=- @ 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-и разрядное беззнаковое целое число с псевдослучайным значением.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Sep 17 2006, 19:21
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



ОК! Спасибо. Работает.

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


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

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


для чего это нужно практически? Что будет есил использовать/ не использовать эту функцию?
Go to the top of the page
 
+Quote Post
vooon
сообщение Sep 17 2006, 19:45
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 72
Регистрация: 27-06-06
Из: Msk
Пользователь №: 18 401



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


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

вроде так smile.gif
Go to the top of the page
 
+Quote Post
_artem_
сообщение Sep 17 2006, 19:58
Сообщение #8


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



так как 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() на другой программе.


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
makc
сообщение Sep 17 2006, 20:10
Сообщение #9


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



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


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


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


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


Если не будете делать srand() или будете делать srand( _константа_ ), то в результате вызова rand() будете получать одни и те же значения. Проблема только в этом.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01421 секунд с 7
ELECTRONIX ©2004-2016