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

 
 
> Как функцией 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
 
Start new topic
Ответов
-=Женек=-
сообщение Jan 13 2008, 18:45
Сообщение #2


Знающий
****

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



Я прекрасно понимаю что делаю, это вы не понимаете мой код, с чего вы взяли, что я беру остаток от деления? Я беру случайное число, вычитаю из него 2768, чтобы результат был не выше 29999, делаю с ним (unsigned int), чтобы результат не был отрицательным. Далее делю на 10000 и беру результат, а не остаток от деления. В тоге получаю 0,1 или 2.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 13 2008, 18:51
Сообщение #3


Гуру
******

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



Цитата(-=Женек=- @ Jan 13 2008, 20:45) *
Я беру случайное число, вычитаю из него 2768, чтобы результат был не выше 29999, делаю с ним (unsigned int), чтобы результат не был отрицательным. Далее делю на 10000 и беру результат

Вот результат Вы себе и не представляете sad.gif.
1. результат зависит от MAX_RAND, который отнюдь не обязан бвть 0x7FFF
2. При подаче на вход случайной последовательности получите искажение исходного распределения вероятности.
Цитата
, а не остаток от деления.

Я учился в школе, по этой причине я не мог говорить, что Вы берете остаток от деления, я говорил, что НАДО ПРОСТО ВЗЯТЬ ОСТАТОК ОТ ДЕЛЕНИЯ.
Код
   Current[y] = rand() % 3;


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 13 2008, 19:14
Сообщение #4


Гуру
******

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



Цитата(zltigo @ Jan 13 2008, 20:51) *
НАДО ПРОСТО ВЗЯТЬ ОСТАТОК ОТ ДЕЛЕНИЯ.
Верхняя математика мне давалась тяжело, поэтому вопрос - будет ли остаток иметь такое же распределение, как и исходное число? Интуитивно чувствую, что частное будет, а остаток?

Цитата(zltigo @ Jan 13 2008, 19:09) *
Сергей! Ты, конечно, не поверишь!! но это правда!!! - твой ответ неверен!!!! sad.gif
При значении rand() == RAND_MAX ты получишь число 3 smile.gif
Ну ладно, подколол, подколол smile.gif Current[y] = rand() / ((RAND_MAX + 1) / 3). Ну и еще подумать об округлениях. Тогда ((RAND_MAX + 2) / 3).

Цитата(-=Женек=- @ Jan 13 2008, 20:45) *
делаю с ним (unsigned int), чтобы результат не был отрицательным. Далее делю на 10000 и беру результат
Посмотрите внимательнее свой код - вы преобразуете к (unsigned int) результат после деления, а не до.
Цитата(-=Женек=- @ Jan 13 2008, 21:02) *
Кстати, MAX_RAND менял - не помогало.
Библиотечный макрос называется RAND_MAX. ReAl вам пытался объяснить, что RAND_MAX менять не нужно - она задана вам "свыше" автором библиотеки. И как бы вы ее не меняли - код, скомпилированный в библиотеку об этом ничего не знает. Переопределяя RAND_MAX вы можете только сделать ваш код обработки (если он использует RAND_MAX) несовместимым с библиотечной функцией, ничего больше.


--------------------
На любой вопрос даю любой ответ
"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
zltigo
сообщение Jan 13 2008, 19:31
Сообщение #5


Гуру
******

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



Цитата(Сергей Борщ @ Jan 13 2008, 21:14) *
Ну ладно, подколол, подколол smile.gif Current[y] = rand() / ((RAND_MAX + 1) / 3).

Подставился!
А RAND_MAX+1 это сколько? 0 при unsigned или вообще отрицательное число при signed?


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


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

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



Цитата(zltigo @ Jan 13 2008, 21:31) *
Подставился!
А RAND_MAX+1 это сколько? 0 при unsigned или вообще отрицательное число при signed?

По стандарту rand() имеет тип int и возвращает значения в диапазоне [0, RAND_MAX], так что RAND_MAX <= INT_MAX и (RAND_MAX+1) вполне влазит в unsigned int.


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


Гуру
******

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



Цитата(ReAl @ Jan 13 2008, 21:55) *
вполне влазит в unsigned int.

Влазит, но тогда будет надо корректно явно производить операции с unsigned.
Например, что будет напечатано:
Код
#define SOME 0x7FFFFFFF
int z = SOME;
printf( "Result1=%i\n", z/((SOME+1)/3) );
printf( "Result2=%u \n", z/((SOME+1)/3) );
printf( "Result3=%i\n", ((unsigned int)z)/((SOME+1)/3) );

Это я и имел ввиду,когда писал Сергею
Цитата
Не наступи!


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

Сообщений в этой теме
- -=Женек=-   Как функцией rand() получить число от 0 до 2 ?   Jan 13 2008, 11:33
- - IgorKossak   Функция int rand(void) возвращает целое число в ди...   Jan 13 2008, 11:50
|- - Petka   Цитата(IgorKossak @ Jan 13 2008, 14:50) Ф...   Jan 13 2008, 11:57
|- - zltigo   Цитата(IgorKossak @ Jan 13 2008, 13:50) П...   Jan 13 2008, 11:59
|- - ReAl   Цитата(IgorKossak @ Jan 13 2008, 13:50) Ф...   Jan 13 2008, 13:33
|- - zltigo   Цитата(ReAl @ Jan 13 2008, 15:33) А-а-а...   Jan 13 2008, 13:59
- - -=Женек=-   мне не нужна плавающа точка. Ваш пример не работае...   Jan 13 2008, 12:21
|- - zltigo   Цитата(-=Женек=- @ Jan 13 2008, 14...   Jan 13 2008, 12:52
- - Rst7   ЦитатаТак просто не отделаетесь - Автор хотел диа...   Jan 13 2008, 14:55
- - ReAl   Да, конечно, while( r == 3), это я глюкнул - не ус...   Jan 13 2008, 15:01
- - -=Женек=-   Господа, ну конкретный результат кто-нибудь может ...   Jan 13 2008, 15:43
|- - Сергей Борщ   Цитата(-=Женек=- @ Jan 13 2008, 17...   Jan 13 2008, 16:21
|- - zltigo   Цитата(Сергей Борщ @ Jan 13 2008, 18:21) ...   Jan 13 2008, 17:09
- - -=Женек=-   брр... а RAND_MAX тогда чему равен? И к чему эти д...   Jan 13 2008, 16:34
- - Kirill Trusov   я конечно салага но 3 вопроса 1. для какого компи...   Jan 13 2008, 16:41
- - -=Женек=-   Цитатая конечно салага но 3 вопроса 1. для какого...   Jan 13 2008, 17:35
|- - zltigo   Цитата(-=Женек=- @ Jan 13 2008, 19...   Jan 13 2008, 17:47
- - -=Женек=-   Знаете, за что я благодарен форуму? Пока дождешься...   Jan 13 2008, 18:26
|- - zltigo   Цитата(-=Женек=- @ Jan 13 2008, 20...   Jan 13 2008, 18:36
- - -=Женек=-   И что? ну пусть будет 31232, делим на 3, получаем ...   Jan 13 2008, 19:02
- - Rst7   ЦитатаПРоделайте свой код с каждым из них в письме...   Jan 13 2008, 19:04
- - Rst7   Другое дело, что деление сюда прикладывать как-то ...   Jan 13 2008, 19:19
- - ReAl   RE: Как функцией rand() получить число от 0 до 2 ?   Jan 13 2008, 19:29
- - Rst7   ЦитатаВроде нигде не промахнулся... Таки немного ...   Jan 13 2008, 19:51
- - mdmitry   Вопрос в дискуссию: кто-нибудь из авторов варианто...   Jan 13 2008, 21:44
|- - zltigo   Цитата(mdmitry @ Jan 13 2008, 23:44) Там ...   Jan 13 2008, 21:49
|- - Kirill Trusov   Цитата(mdmitry @ Jan 13 2008, 23:44) Вопр...   Jan 15 2008, 19:52
- - Elegorod   Кодint a = (new java.util.Random()...   Jan 14 2008, 19:57


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:20
Рейтинг@Mail.ru


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