| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > rand() |
| Автор: ДобренькийПапаша 29.4.2006, 19:38 |
| Итак, как сделать так, чтобы рандились, либо -1, либо -2, либо 1, либо 2. Функция вызывается рекурсивно, надо, чтобы постоянно рандилось в разной последовательности. |
| Автор: BreakPointMAN 29.4.2006, 19:56 |
| В чем проблема? |
| Автор: ДобренькийПапаша 29.4.2006, 20:06 |
| Надо запрограммировать смещение коня в шахматах. Для этого мне надо чтобы рандились эти четыре числа. |
| Автор: BreakPointMAN 29.4.2006, 20:19 |
| ну и? что не получается-то? как функция rand() работает, ты знаешь? |
| Автор: Kuber 29.4.2006, 20:24 | ||||
Попробуй так... |
| Автор: BreakPointMAN 29.4.2006, 20:30 |
| Kuber, Бог ты мой! А еще подлиннее нельзя было?!??!?!? |
| Автор: ДобренькийПапаша 29.4.2006, 20:40 | ||
Рандит только 0. Прога конечно в разработке)))). Тут много неправильно пока что.
|
| Автор: BreakPointMAN 29.4.2006, 20:55 | ||||
Вот и всё.
|
| Автор: Step 29.4.2006, 21:00 | ||||
если вы в таком тоне притендуете на краткость и оптимальность своего кода
то вынужден вас расстроить это не самое идеально решение ЗЫ: это что бы вам предупреждения не влиплять |
| Автор: BreakPointMAN 29.4.2006, 21:08 |
Ну, я не утверждал, что мое решение "самое идеально"... |
| Автор: BreakPointMAN 29.4.2006, 21:49 | ||
Можно так еще... равновероятность повыше будет:
|
| Автор: Void 29.4.2006, 22:35 | ||
| BreakPointMAN, во-первых, UB Во-вторых, для въезжания в этот код требуется (ну по крайней мере мне) секунд 10–15. Write-only, одним словом. Хотя, если сопроводить комментарием… Я бы, пожалуй, написал так, не претендуя ни на краткость, ни на производительность, но, надеюсь, на очевидность производимых действий:
|
| Автор: BreakPointMAN 29.4.2006, 23:00 |
Не-а... В остальном согласен. |
| Автор: Void 29.4.2006, 23:02 | ||||
Раз assignment.
Два assignment. Ы? |
| Автор: nikitao 29.4.2006, 23:09 | ||
| Господа,вы в своих спорах завязли,а человек ответа на свою проблему не получил Вообще полностью согласен с Void.С++сты часто с убийственным рвением укарачивают,сжымают код(благо язык очень гибкий),но про читабельность просто забывают. Ладно теперь по делу: ДобренькийПапаша, у тебя всегда генерируется ноль из-за того что ты забыл про вызов srand() Добавлено @ 23:15 А вот теперь,давайте пофлудим Конструкции типа
уже нехороши хатя бы тем,что два опытных программиста начинают спорить про их работаспасобность.Сегодня пусть эта конструкция работает,а завтра в попых чуть-чуть измененная уже не будет.Т е мы стоим на грани(если не перешли) практически безпречинно.Я не говорю ,что код надо упрощать до предела,просто во всем еадо знать меру. |
| Автор: BreakPointMAN 29.4.2006, 23:16 |
| ммм... наверное, прав... пошел я читать Стандарт и http://alenacpp.blogspot.com/2005/11/sequence-points.html.. |
| Автор: Kuber 29.4.2006, 23:17 |
| Думаю это не совсем к теме. Люблю С++ за то(еще много за что |
| Автор: Fin 29.4.2006, 23:24 | ||
| nikitao, srand нужен только для того, чтобы сбить генератор псевдослучайных чисел. Он никак не решает проблему 0. Добавлено @ 23:29 А что мне действительно нравится, так эта конструкция
|
| Автор: nikitao 29.4.2006, 23:29 | ||
Fin, или я тебя не понял или ты говоришь не правду:
У меня всегда при запуске выдаёт 41,а у тебя будет выдовать другое,но постоянное число |
| Автор: Fin 29.4.2006, 23:37 | ||
nikitao, Вот именно. Что постоянное число. Произведи свой эксперемент дальше. И увидеш, что числа будут меняться.
Чтобы этого не происходило при каждом запуске программы, ставят в самом начале вызов функции srand. |
| Автор: nikitao 29.4.2006, 23:45 |
| |
| Автор: Fin 29.4.2006, 23:53 |
| Та конструкция из кода, что я привел. Вот она решает проблему. Правда на распечатке должно быть сначало 1, а затем 2. Если учесть, что функция knight(i,j,n,a); никак не влияет на переменную n. |
| Автор: Helicopterr 1.5.2006, 00:48 | ||||
srand() (start rand) инициализирует rand, что необходимо для его работы.
|
| Автор: papam 1.5.2006, 14:42 |
| Добренький папаша могу скинуть готовую прогу!Напиши куда!Тыж мне помогал!!!!!!!!!!!!!!!!!!!!! |
| Автор: Heremum 1.5.2006, 18:53 | ||
Вы чего тут так извратились? Алгоритм простейший: генерируем с помощью rand() числа от -2 до 2:
|
| Автор: Helicopterr 1.5.2006, 23:50 |
| Heremum а ты результат своего кода видел? у меня это: -3, -2, -1, -3, -4, -2, -2, -2, -4 А теперь прочти условие задачи... + еще маленькая проблемка эта последовательность (у тебя на компе может быть другой) будет такой же при новом запуске программы. Вот мы тут и... как ты там написал? извращаемся? |
| Автор: Heremum 4.5.2006, 17:52 | ||
Значения в диапозоне [-2; 2]. |
| Автор: Fin 4.5.2006, 22:51 | ||||||||
Heremum, Я надеюсь, ты условия задачи читал более внимательно, чем все остальные.
В данном коде
somevalue всегда будет или -1 или -2. Ты никогда не получиш значения 1 или 2. Так что твое высказывание
не совсем понятно. По моему личному мнению, наиболее простой и надежный вариант предложил Void Только его нужно чуть доработать.
|
| Автор: Void 4.5.2006, 22:59 |
| Fin, я не случайно написал так, как написал, а не rand() % 4. Это дает более равномерное распределение в случае ГПСЧ. |
| Автор: Fin 4.5.2006, 23:04 |
| Void, В твоем случае, могут быть проблемы с откидыванием дробной части. Так как Все числа целочисленые. Добавлено @ 23:12 Сейчас проверил у себя на компиляторе. Два подхода работают. Так что может быть я слишком перестраховываюсь |
| Автор: Void 4.5.2006, 23:12 |
| Fin, если RAND_MAX достаточно велик (хотя бы 255), проблем не будет. |
| Автор: Fin 4.5.2006, 23:22 | ||
| RAND_MAX стандартно равен 32767 А вот код генератора псевдослучайных чисел, который стандартно поставляется вместе с библиотеками С
Источник: http://algolist.manual.ru/maths/generator/standard.php |
| Автор: Void 4.5.2006, 23:31 |
Не совсем. В C99 сказано, что RAND_MAX должен быть не менее 32767. Что, впрочем, ситуации не меняет, спасибо за напоминание |