|
2 / 2 / 1
Регистрация: 12.02.2018
Сообщений: 48
|
|||||||||||
Сгенерировал 100000 точек в рандомных позициях. Почему они чаще выбирают верх слева?17.10.2018, 00:34. Показов 7227. Ответов 37
Метки нет (Все метки)
Красный - много точек
Оранжевый - немного точек Жёлтый - минимум точек Функция рандома:
0
|
|||||||||||
| 17.10.2018, 00:34 | |
|
Ответы с готовыми решениями:
37
Пагинация сайта слева, почему при скролле вверх, как сделать что бы они постепенно удалялись? Доходя до каждого id? Почему администраторы выбирают библиотеку на ленте, а не на оптическом носителе?
|
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,405
|
|||||||
| 18.10.2018, 21:02 | |||||||
Сообщение было отмечено DrOffset как решение
РешениеRAND_MAX является относительно небольшой по сравнению с размером диапазона, который вы пытаетесь генерировать. Например, в стандартной библиотеке Visual Studio ширина диапазона rand() равно 32768, а ширина генерируемого вами диапазона - 20000. Вот именно часть, соответствующую доле 20000 внутри 32768 вы и видите в виде квадрата, более плотно заполненного значениями.Способ конвертации диапазонов через оператор % ни в коем случае нельзя применять, когда ширина целевого диапазона приближается к RAND_MAX и не является делителем RAND_MAX + 1.То есть rand() тут ни в чем не виноват - накосячили исключительно лично вы. С таким же успехом вы могли запросить от своей randInRange значения от 0 до 100000 и с "удивлением" бы обнаружили, что числа выше 32767 вообще не генерируются. Можно выполнить конвертацию диапазонов делением , а не остатком, что даст более "равномерную" картину, но в такой ситуации и в ней все равно будут заметны "узоры". Если вы хотите получить числа в диапазоне шириной 20000, то в качестве исходного генератора вам нужен либо генератор с кратной шириной, либо генератор с на порядки большей шириной.Например, простейшим способом построим на базе все того же rand() генератор с более широким диапазоном
1
|
|||||||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,405
|
||||
| 18.10.2018, 21:51 | ||||
Сообщение было отмечено DrOffset как решение
РешениеТут смешно даже дискутировать: в таком тривиальном вопросе, как равномерное заполнения прямоугольного поля псевдослучайными точками никаких продвинутых ГПСЧ не нужно. И рассказывать традиционные байки про "качественные ГПСЧ" в связи с этой темой - дешевая профанация. rand(), для ее сферы применения, нет и никогда не было. В данном случае мы имеем дело не с криптографией и не с симуляцией научных экспериментов, а с обычным тривиальным использованием функции rand() для равномерного заполнения прямоугольного поля точками - это вполне в пределах ее области применимости. Результат вызван наивной и часто встречающейся ошибкой автора кода, как описано в моем ответе выше, а не какими-то проблемами в rand(). Автор пытается рассадить четырех голубей по трем гнездам и искренне удивляется, что все время получается "неравномерно".rand(). В данном случае мы как раз и наблюдаем одну из классических таких ошибок.Посылка "функция хреновая потому, что новички все время неправильно ей пользуются", возможно, вполне оправдана в рамках учебников для начинающих. И этот форум, согласно его названию, посвящен именно начинающим. Но тем не менее в этой теме мы рассматриваем вполне конкретное поведение программы, которое является следствием ошибки/заблуждения автора кода, а не какой-то "хреновости" rand().
1
|
||||
|
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
|
||
| 18.10.2018, 22:24 | ||
![]() Ваш код выше не доказывает ничего. Вы показали что реализация rand в вашем компиляторе проходит один единственный тест. Классическая проблема для ЛКМ - спектральные тесты. У ТС как раз его следствие. Если что смотрим RANDU.
0
|
||
|
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,356
|
|||||||
| 18.10.2018, 22:25 | |||||||
|
Функция:
Я уверен, что даже если в полноэкранном приложении (разрешение экрана моего ноутбука 1366х768) начать нормальным кодом с использованием обычного rand зарисовывать случайные точки - то они расположатся вполне себе случайно, без каких-либо узоров. Более того, если обычной линейной конгруэнтной функцией (с хорошими коэффициентами) делать то же самое - результат будет тот же. Могу это продемонстрировать, но с использованием Qt, т.к. приложение графическое.
0
|
|||||||
|
1359 / 857 / 366
Регистрация: 26.02.2015
Сообщений: 3,831
|
|
| 18.10.2018, 22:52 | |
|
alexu_007, ты мне напоминаешь Fulcrum_013.
0
|
|
|
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,356
|
|
| 18.10.2018, 23:07 | |
|
Не знаю такого.
0
|
|
|
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
|
||||||
| 18.10.2018, 23:22 | ||||||
|
TheCalligrapher, т. е. мы будем колоться и жрать кактус но утверждать что стандартная функция rand() валидна? ок...
только почему то сами TheCalligrapher и предложили усиленную версию этой функции в попытке избежать бага базовой - прелессно вместо того что бы просто использовать стандартный ГПСЧ от Джорджа Марсаглии функцию mwc() как предложил я в первом посте или веретено мерсена aka std::mt19937 как и предлагал sourcerer во втором а так да... функция rand() валидна... для генерации подбрасывания кубика Добавлено через 10 минут кстати если вы гонитесь за скоростью можно использовать алгорит xor128 от того же Джорджа Марсаглии, он раз в 5 быстрее функции mwc()
P. S. если кому интересно вот статья на Википедии про Джорджа Марсаглию, но надо уметь в английский
0
|
||||||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,405
|
||||||
| 19.10.2018, 00:08 | ||||||
rand() вдруг стала "не валидной"? Маразм крепчал...randInRange, чтобы избавить ее от ТС-овского бага, присутствовавшего в оригинальной версии функции randInRange. В rand() же никакого бага нет.Заодно не оставлю и камня на камне от вашего странного утверждения об некоем "усилении": всем понятно, что генерация ПСЧ в моей версии функции по-прежнему делается линейным конгруэнтным методом. Я лишь расширил разрядность генератора. То есть в моем варианте по-прежнему используется классический rand(). (Постарайтесь в будущем не делать таких вот бессмысленных вбросов, чтобы мне не пришлось тратить не постановку вас на место.)Для интересующихся: "пионерские" байки про какие-то "баги" в rand() пошли из старой истории про непродуманный выбор параметров в старинной BSD-шной версии стандартной библиотеки (https://www.researchgate.net/p... Structures). Это байки из категории "это было давно и неправда". С таким же успехом вы нам тут можете рассказывать про "баги" и "невалидность" операции деления в языке С++, которая утверждает, что 2 / 5 дает 0. Вы же сразу бросились, образно выражаясь, "искать, где светло, а не там, где потеряли": нести постороннюю чушь про какие-то воображаемые проблемы с rand(), а когда исправлять наспех наговоренную белиберду стало поздно, принялись флудить тему посторонними иррелевантными разглагольствованиями.
0
|
||||||
|
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
|
||||||
| 19.10.2018, 00:10 | ||||||
|
ТС, попробуй так:
1
|
||||||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,405
|
||
| 19.10.2018, 00:30 | ||
|
Кстати, для задачи равномерного заполнения плоскости точками получается вполне приемлемый результат. Исходная проблема распределения присутствует и в этом варианте, но "размазана" по плоскости более равномерно.
0
|
||
|
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
|
|
| 19.10.2018, 00:54 | |
|
TheCalligrapher, мой вариант хорош, если диапазон <= RAND_MAX.
Если больше, то мой вариант не будет выдавать некоторые значения, а твой вариант со складыванием приведёт к треугольному распределению, а в пределе к нормальному (если не ошибаюсь). http://sci.alnam.ru/book_dsp.php?id=28
0
|
|
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,405
|
|||||||
| 19.10.2018, 01:14 | |||||||
RAND_MAX + 1.Для платформы с RAND_MAX == 32767 (то есть 15 псевдослучайных битов) я фактически сделал
0
|
|||||||
|
|
|
| 19.10.2018, 01:44 | |
|
агерон, ты зря гонишь на hoggy, ты упёрся в свои статьи о степени псевдости в псевдослучайности и про то как бородатые дядьки криптографы в своих бородацых тестах её ломают, вместо того, чтобы спуститься в реальный мир к проблемам ТСа, у которого не суперпупер шифроалгоритм в абсолютно белом шуме нуждается, а надо просто чёртов экран плюс-минус равномерно пикселями заполнить!
Какие, к дьяволу, проблемы конгруэнтных ГПСЧ? Да я если просто из функции clock() напрямую числа буду брать для точек, у меня экран равномернее заполнится! У меня всё сильнее возникает чувство, что флуд о разных способах ГСПЧ тебе более интересен, чем конкретная программа автора... Добавлено через 6 минут Отвечаю на вопрос автора. Ваша проблема в том, что RAND_MAX=30000 в малых диапазонах остаток от деления rand() скажем на 100 всегда случаен. остаток же от деления rand() на почти 60% от RAND_MAX уже вполне предсказуем. провельте генерацию координат типа rand()*rand()%(max-min) Добавлено через 3 минуты TheCalligrapher, ой, прости меня пожалуйста, не прочитал вторую страницу темы. Думал, заскочу на белом коне с ответом в этот эпичный срач о кознгрунуэ ных ГСПЧ, начатый агероном, жаль опоздал, не видел второй страницы.
0
|
|
|
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
|
|||
| 19.10.2018, 05:07 | |||
|
Kuzia domovenok
вот тебе бы понравилось если бы ты получил только 60% от зарплаты?TheCalligrapher меня это умиляет , я написал свой линейный конгруэнтный генератор расширенной разрядности на основе бажного стандартного, но продолжаю утверждать что функция rand() из стандартной поставки компилятора валидна.... про процент валидности этой фукции красноречиво написал Kuzia domovenokкак вы не понимаете ГСПЧ работающий на 60% диапазона это как бы по мягче сказать.... осетрина второй свежести ![]() ГСПЧ обязан!!! выдавать валидные значения на 100% доступного диапазона, и при этом проходить diehard тесты, все остальное от лукавого, и если генератор не удовлетворяет подобным условия это не ГСПЧ а что-то на него похожее, и никак иначе, да подобная функция может применяться в учебных задачах в качестве замены валидного ГСПЧ если нет альтернативы, как к примеру в 70 годах 20 столетия когда по сути и возник метод линейного конгруэнтного генератора, т. к. на тот момент не знали ему альтернатив, но в современных условиях его использование очень сильно ограниченно даже в учебных целях т. к. валидный статестический генератор занимает 5-7 строк кода на С++ просто многим программистам лень выходить за пределы стандартной библиотеки языка и зачастую они используют только узкий набор инструментария и знаний, альтернативные точки зрения на привычные стандартные вещи воспринимаються очень тяжело, даже если альтернативные варианты более верно решают поставленную задачу TheCalligrapher, тебе проще написать свою реализацию линейного конгруэнтного генератора расширенной разрядности которая просто отодвигает проблему, а не решает ее чем признать что этот инструмент не валидный вот за это я и не люблю велосипеды т. к. они горячо защищаються их создателями, т. к. им обидно что их творение "хаят", а то что эта поделка может нести в себе критическую ошибку... ну что ж мы будем на это не обращать внимания P. S. ради справедливсти я тоже люблю писать велосипеды и частенько стараюсь их защитить и переиспользывать ![]() но суть то в другом... доказывая всем, а впервую очередь начинающим что можно использывать бажные инструменты вы совершаете системную ошибку как в обучении начинающих так и в разработке ПО, начинающие должны знать о проблемах и границах пременимости стандартных инструментов, а также о валидных заменах ошибочных инструментов к коим и относиться стандартная реализация функции rand в компиляторе. Именно поэтому, из-за 60% пременимости к диапазону стандартная rand() и являеться плохой математической функцией в задаче метода монте-карло которую и пытаеться решить TC TheCalligrapher кстати мы кидаем не просто "кубик" в задаче TC, а 2 "кубика" что собой являет 2-x мерное распределение по x и y ординате, и с учетом этого для стандартной функции rand() все совсем грустно Кстати к вопросу об усилении функции, по сути ты написал генератор 2 поколения на основе генератора 1 поколения с учетом пост знания об ошибке генератора 1 поколения, но ведь ошибка генератора первого поколения осталась!!! ты ведь не переписал стандартную функцию rand() c помощью пост знания об ошибке генератора 1 поколения ты просто написал усиленный генератор 2 поколения, который генерирует данные в тех же пределах 60% от максимального диапазона, но системную ошибку стандартного генератора так и не решил, а просто расширил диапазон чтобы 60% валидного диапазона с лихвой покрывали требуемый диапазон точек TC, подобное усиление функции не всегда являеться допустимым т. к. зачастую не решает системных ошибок!!! а вот статистически валидные ГСПЧ на данный момент не проявляют подобных системных ошибок, вот о чем я веду речь, а не просто о стандартной функции rand()
0
|
|||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,405
|
|||||
| 19.10.2018, 06:05 | |||||
rand(), эти баги там не появятся. Ваши таинственные туманные рассказы про какие-то якобы существующие там "баги" тут никому не интересны. Вам придется либо указать нам на эти баги, либо признать, что вы несли чушь. rand() обязана выдавать валидные значения в диапазоне от 0 до RAND_MAX. Ничего иного от нее никто не требует и не ожидает. Именно это и делает стандартная функция rand(). Никаких нарушений спецификации rand() мы здесь не обнаружили.Что вы несете? Я кажется начинаю понимать. Вы, несмотря на приведенные участниками этой дискуссии детальные (детальнейшие!) объяснения того, что произошло в программе ТС, до сих пор тупо не врубились в эти объяснения. То есть вы до сих пор не поняли, что исходная неравномерность распределения, показанная в первом посте ТС, не имеет никакого отношения ни к каким "багам" в rand(), а является чисто и исключительно особенностью ("багом") кода ТС? Сорри, молодой человек, пока вы не удосужитесь разобраться в таких элементарных вещах, я буду вынужден классифицировать ваши разглагольствования как тупой троллинг. Nuff said.
0
|
|||||
|
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,356
|
||
| 19.10.2018, 07:05 | ||
|
То, что у него на экране - это его лажа, а не rand().
0
|
||
|
|
||
| 19.10.2018, 07:43 | ||
|
агерон,я повторяю вопрос: тебе просто флудить нравится или что?
Добавлено через 2 минуты
0
|
||
|
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,356
|
||
| 21.10.2018, 08:40 | ||
|
Проверил до 1 000 000, дальше неохота, т.к. уже это работает несколько минут:
0
|
||
| 21.10.2018, 08:40 | |
|
Есть матрица из [100000][100000] как лучше ее представить в голове компьютера) Просуммировать числа, находящиеся на чётных позициях в массиве, если они не равны -5 Quicksort, отсортировать элементы массива, стоящие на четных позициях, чтобы они располагались по убыванию Расположить нулевые элементы массива так, чтобы они стояли только на четных позициях
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|