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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Как функцией rand() получить число от 0 до 2 ?
-=Женек=-
сообщение Jan 13 2008, 11:33
Сообщение #1


Знающий
****

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



Как функцией rand() получить число от 0 до 2 ?
Да и объясните про srand() я каждый раз в цикле вызываю srand(rand()); но на работу rand() это не оказывает влияния.

короче говоря у меня есть массив Current[3], его нужно заполнить числами от 0 до 2

for (y=0;y<3;y++)
{
srand(rand());
Current[y]= что здесь?

}
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 13 2008, 11:50
Сообщение #2


Шаман
******

Группа: Модераторы
Сообщений: 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
}
Go to the top of the page
 
+Quote Post
Petka
сообщение Jan 13 2008, 11:57
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 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()!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 13 2008, 11:59
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Jan 13 2008, 12:21
Сообщение #5


Знающий
****

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



мне не нужна плавающа точка.
Ваш пример не работает. Не могу к сожалению проверить, что он выдает, от числа получаемого фоункцией зависит номер зажигаемого светодиода - в моем случае не горит ничего.
Пишу в CodeVision
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 13 2008, 12:52
Сообщение #6


Гуру
******

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



Цитата(-=Женек=- @ Jan 13 2008, 14:21) *
от числа получаемого фоункцией зависит номер зажигаемого светодиода

1. Число лежит в диапазоне от 0 до RAND_MAX, кое обычно (посмотрите в stdlib.h) не менее 16bit, посему нужно нормализировать до диапазона 0...2 перед употреблением.
2. Уже писал - самое главное rand() НЕ ГЕНЕРИТ СЛУЧАЙНЫЕ ПОСЛЕДОВАТЕЛЬНОСТИ, посему получить четыре случайных числа при каждом запуске не сможете.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 13 2008, 13:33
Сообщение #7


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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
}

А-а-а!!! У-у-у!!! lol.gif
Нет, ну я не могу сдержаться, чесслово.
А сделать
Код
#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() с каким-то "внешне-случайным" аргументом - содержимым какого-то свободно-бегущего атймера в момент нажатия пользователем какой-то кнопки, ещё что-то такое найти.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 13 2008, 13:59
Сообщение #8


Гуру
******

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



Цитата(ReAl @ Jan 13 2008, 15:33) *
А-а-а!!! У-у-у!!! lol.gif
Код
        r = rand() & 0x03;
}

Так просто не отделаетесь smile.gif - Автор хотел диапазон 0...2 а не 0...3
Цитата
srand() вызывать вообще не обязательно.

Ну хоть какой-то элемент случайности smile.gif ввиде однократного выбора при программировании вызов srand() c аргументом отличным от 1 вносит...


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 13 2008, 14:55
Сообщение #9


Йа моск ;)
******

Группа: Модераторы
Сообщений: 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, повторять. Чето тема получилась веселейшая. На наших гуру и шаманов видимо торможение напало smile.gif - Старый Новый год, чтоли?

Цитата
Хороший генератор, как цвет автомобиля у Генри Форда


Черт. И я торможу. Там конечно должно быть while(r==3)

Все, на сегодня с форумом надо завязывать. smile.gif

Сообщение отредактировал zltigo - Jan 13 2008, 14:56


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 13 2008, 15:01
Сообщение #10


Нечётный пользователь.
******

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



Да, конечно, while( r == 3), это я глюкнул - не успокоился ещё, а уже писать начал - и сам народ повеселил biggrin.gif


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Jan 13 2008, 15:43
Сообщение #11


Знающий
****

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



Господа, ну конкретный результат кто-нибудь может выдать?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 13 2008, 16:21
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Jan 13 2008, 16:34
Сообщение #13


Знающий
****

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



брр... а RAND_MAX тогда чему равен? И к чему эти деления,
если я изначально пропишу его как 3?
Go to the top of the page
 
+Quote Post
Kirill Trusov
сообщение Jan 13 2008, 16:41
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 90
Регистрация: 17-08-07
Пользователь №: 29 867



я конечно салага но 3 вопроса
1. для какого компилятора , винавр?
2. разве не надо было брать rand()%2 брать целое от деления, вроде на си так в прогах писал когда надо было псевдослучаееноость

3. а вообще есть такая библиотека для авр, т.е на основании чаво она генерирует числа? не проще ли записать какойто набор чисел случаенных и по ним ходить по кругу, всяко ранд тоже псевдослучаенные дает
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 13 2008, 17:09
Сообщение #15


Гуру
******

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



Цитата(Сергей Борщ @ Jan 13 2008, 18:21) *
Current[y] = rand() / (RAND_MAX / 3);
Арифметика, пропорции, четвертый класс.

Сергей! Ты, конечно, не поверишь!! но это правда!!! - твой ответ неверен!!!! sad.gif
При значении rand() == RAND_MAX ты получишь число 3 smile.gif
Осталось чуть-чуть подправить, но на этом пути есть еще одна проблемка. Не наступи!

Цитата(-=Женек=- @ Jan 13 2008, 18:34) *
брр... а RAND_MAX тогда чему равен?

Не принципиально, а где конкретное значение посмотреть я писал.


Цитата(Kirill Trusov @ Jan 13 2008, 18:41) *
1. для какого компилятора , винавр?

Любого сишного. Это ANSI, однако.
На счет остального пока помолчу, дабы интрига осталась....


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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