|
Как функцией rand() получить число от 0 до 2 ? |
|
|
|
Jan 13 2008, 11:50
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Функция int rand(void) возвращает целое число в диапазоне [0, RAND_MAX]. Функция void srand(int seed) служит для задания начального значения случайной последовательности. Для Вашего случая слишком маловат диапазон, или Вы хотите результат с плавающей точкой? Пример лучше переписать так: Код #define RAND_MAX 2000 for (y=0;y<3;y++) { srand(5); // любое число не = 1 Current[y] = (float)rand() / 1000.0; // если это массив значений float }
|
|
|
|
|
Jan 13 2008, 11:57
|
Профессионал
    
Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886

|
Цитата(IgorKossak @ Jan 13 2008, 14:50)  Функция int rand(void) возвращает целое число в диапазоне [0, RAND_MAX]. Функция void srand(int seed) служит для задания начального значения случайной последовательности. Для Вашего случая слишком маловат диапазон, или Вы хотите результат с плавающей точкой? Пример лучше переписать так: Код #define RAND_MAX 2000 for (y=0;y<3;y++) { srand(5); // любое число не = 1 Current[y] = (float)rand() / 1000.0; // если это массив значений float } ЭЭЭ! srand() надо вынести ЗА цикл. Иначе получите просто одинаковые значения при каждом вызове rand()!
|
|
|
|
|
Jan 13 2008, 11:59
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(IgorKossak @ Jan 13 2008, 13:50)  Пример лучше переписать так: Код for (y=0;y<3;y++) { srand(5); // любое число не = 1 Current[y] = (float)rand() / 1000.0; // если это массив значений float } Ошибка. Это псевдослучайный генератор, который стабильно будет повторять последовательность при одинаковом исходном значении. Посему, как минимум, srand() вне цикла: Код srand(5); // любое число не = 1 for (y=0;y<3;y++) { ......... }
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 13 2008, 13:33
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(IgorKossak @ Jan 13 2008, 13:50)  Функция int rand(void) возвращает целое число в диапазоне [0, RAND_MAX]. ... Пример лучше переписать так: Код #define RAND_MAX 2000 for (y=0;y<3;y++) { srand(5); // любое число не = 1 Current[y] = (float)rand() / 1000.0; // если это массив значений float } А-а-а!!! У-у-у!!!  Нет, ну я не могу сдержаться, чесслово. А сделать Код #define LONG_MAX 7 #define LONG_MIN -8 и таким образом ограничить диапазон значений long никто не пробовал? Рекомендую! А если вдруг я ещё не все комнаты смеха посетил и где-то есть компилятор, настолько не соответствующий стандарту, что переопределение RAND_MAX в пользовательском коде вот так просто влияет на поведение библиотечной rand() - адресок сбросьте, а! -=Женек=-, думаю, для светодиодов каких-то особых качеств генератора не нужно и этого хватит с головой (если вообще использовать библиотечный rand() ) Код #include <stdlib.h>
unsigned char led_rand() { unsigned char r; do { r = rand() & 0x03; } while( r == 3); // тута ошибочка была, исправлено return r; } srand() вызывать вообще не обязательно. Ну если хочется, чтобы каждый раз при включении не повторялась 1:1 последовательность (всё равно когда-то выйдет на цикл, но хоть чтобы не стартовало каждый раз с разного места) - то надо делать srand() с каким-то "внешне-случайным" аргументом - содержимым какого-то свободно-бегущего атймера в момент нажатия пользователем какой-то кнопки, ещё что-то такое найти.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jan 13 2008, 13:59
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(ReAl @ Jan 13 2008, 15:33)  А-а-а!!! У-у-у!!!  Код r = rand() & 0x03; } Так просто не отделаетесь  - Автор хотел диапазон 0...2 а не 0...3 Цитата srand() вызывать вообще не обязательно. Ну хоть какой-то элемент случайности  ввиде однократного выбора при программировании вызов srand() c аргументом отличным от 1 вносит...
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 13 2008, 14:55
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Так просто не отделаетесь - Автор хотел диапазон 0...2 а не 0...3 .... Цитата(ReAl @ Jan 13 2008, 15:33)  Код do { r = rand() & 0x03; } while( r != 3); Так там цикл, пока результат=3, повторять. Чето тема получилась веселейшая. На наших гуру и шаманов видимо торможение напало  - Старый Новый год, чтоли? Цитата Хороший генератор, как цвет автомобиля у Генри Форда Черт. И я торможу. Там конечно должно быть while(r==3) Все, на сегодня с форумом надо завязывать.
Сообщение отредактировал zltigo - Jan 13 2008, 14:56
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jan 13 2008, 16:21
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(-=Женек=- @ Jan 13 2008, 17:43)  Господа, ну конкретный результат кто-нибудь может выдать? Current[y] = rand() / (RAND_MAX / 3); Арифметика, пропорции, четвертый класс.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 13 2008, 17:09
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Сергей Борщ @ Jan 13 2008, 18:21)  Current[y] = rand() / (RAND_MAX / 3); Арифметика, пропорции, четвертый класс. Сергей! Ты, конечно, не поверишь!! но это правда!!! - твой ответ неверен!!!!  При значении rand() == RAND_MAX ты получишь число 3  Осталось чуть-чуть подправить, но на этом пути есть еще одна проблемка. Не наступи! Цитата(-=Женек=- @ Jan 13 2008, 18:34)  брр... а RAND_MAX тогда чему равен? Не принципиально, а где конкретное значение посмотреть я писал. Цитата(Kirill Trusov @ Jan 13 2008, 18:41)  1. для какого компилятора , винавр? Любого сишного. Это ANSI, однако. На счет остального пока помолчу, дабы интрига осталась....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|