в моём проекте DIGISCRIPT для формирования случайных чисел я использую функцию rand(). все её ограничения по длине псевдослучайной последовательности мне известны и никак не мешают. для получения случайного байта в первой версии проекта я тупо отбрасывал старший байт возвращаемого rand() значения, а для формирования еще меньших чисел, использовал результат операции %, т.е. если хотел получить случайное число не более 25, то делал так: rand() % 25 во второй версии я учел недостатки вышеописанного подхода и теперь использую такой вариант получения случайного числа с ограничением:
Код:
int range_rand(int range){ return (rand() * (uint32_t)range)/RAND_MAX; }
наверное, можно еще как-то улучшить... но сейчас вопрос о другом.
вопрос о том, что для получения случайного цвета используется эта самая функция range_rand(0x100), которая определяет условный номер оттенка. и часто бывает так, что она возвращает, например, подряд 1 и 2 или 5 и 7, т.е. достаточно близкие оттенки, глазом воспринимаемые, как одинаковые.
так вот, в чем, собственно, вопрос: как улучшить выбор случайного номера оттенка из диапазона 0...255 так, чтобы не возникало подряд два близких оттенка?
пока применяю вариант проверки: пока получаю номер оттенка, отличающийся от предыдущего меньше, чем на заданную величину, повторяю вызов функции случайного числа. оно вроде работает, но не так, чтобы я был совсем доволен...
что посоветуете?
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Заголовок сообщения: Re: Алгоитм получения случайного цвета
Добавлено: Вт июн 11, 2019 14:27:54
Собутыльник Кота
Карма: 38
Рейтинг сообщений: 292
Зарегистрирован: Пт сен 07, 2018 20:20:02 Сообщений: 2594 Откуда: деревня в Тульской губернии
Рейтинг сообщения:4 Медали: 1
ARV, хорошо, пусть текущий цвет 5. 5+4=9. Теперь прибавляем случайное число от 0 до 248 (так правильней, но не суть). Если оно 0, то 5+4+0=9. Если 248, то 5+4+248=257=1. То есть, прежний цвет 5 будет отличаться от нового, как минимум, на +-4. Вы же это хотели?
Открыта удобная площадка с выгодными ценами, поставляющая весь ассортимент продукции, производимой компанией MEAN WELL – от завоевавших популярность и известных на рынке изделий до новинок. MEAN WELL.Market предоставляет гарантийную и сервисную поддержку, удобный подбор продукции, оперативную доставку по России.
На сайте интернет-магазина посетители смогут найти обзоры, интересные статьи о применении, максимальный объем технических сведений.
Продукция MOSO предназначена в основном для индустриальных приложений, использует инновационные решения на основе более 200 собственных патентов для силовой электроники и соответствует международным стандартам. LED-драйверы MOSO применяются в системах наружного освещения разных отраслей, включая промышленность, сельское хозяйство, транспорт и железную дорогу. В ряде серий реализована возможность дистанционного контроля и программирования работы по заданному сценарию. Разберем решения MOSO
подробнее>>
Ivanoff-iv
Заголовок сообщения: Re: Алгоитм получения случайного цвета
ну, да, весьма логично, если переменная 8бит: рнд (247) принимает значения от 0 до 247 плюс 4 - и будет от 4 до 251 (от 4 до -4 если тип сигнед чар) если к нему добавить х то в ответе будет х' отличающееся от х не менее чем на 4 в любую сторону... правда разом на 100% яркость не изменится, т.к. для этого алгоритма 255 сосед 0...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Заголовок сообщения: Re: Алгоитм получения случайного цвета
Добавлено: Вт июн 11, 2019 15:43:26
Собутыльник Кота
Карма: 38
Рейтинг сообщений: 292
Зарегистрирован: Пт сен 07, 2018 20:20:02 Сообщений: 2594 Откуда: деревня в Тульской губернии
Рейтинг сообщения:7 Медали: 1
Ivanoff-iv, можно допилить алгоритм. Прибавлять к текущему цвету MIN(3,255-c)+1, а случайное числоа брать не до 256-2*4, 255-MIN(3,255-c)-MIN(4,c) - где с - текущий цвет. То есть, для цветов от 0 до 3 допускать суммарное приращение вплоть до 255, а для цветов 252-255 начинать приращение с нуля.
я возвращаюсь к теме о генерации случайноо цвета. предложенный выше алгоритм особого эффекта не дает. генератор псевдослучайной последовательности из avr-libc слишком часто выдает числа, находящиеся рядом, например 2015 и 2000. поскольку я "масштабирую" это число к диапазону 0-255, то естественно, что результат получается один и тот же... то есть проблема в генераторе случайных чисел есть, и она мешает жить... истинная случайность, как для криптографии не нужна, нужна "красивая" случайность, то есть чтобы после красного почти всегда был не-красный, а после голубого был не-голубой. хуже всего еще то, что при поиске случайных файлов, наблюдается тот же эффект: значительно чаще "выпадают" файлы с номером где-то в середине списка, чем на краю... все это огорчает.
нет ли каких идей для исправления этой ситуации? грубо говоря, нужна функция rnd(int x), которая бы возвращала число от 0 до x (не включая), и при этом вероятность того, что два раза подряд она выдаст одинаковое число была ненулевой, но более-менее малой, а распределение тем не менее стремилось к равномерному?
возможно, есть какой-то принципиально альтернативынй способ управления случайным цветом и номером файла... но я не могу никак его найти...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Ну ты как не электронщик прямо! Делай srand из канала АЦП, на котором антенна болтается. А чтобы реально кошерный набор случайных цветов генерить, сначала проиндексируй их - сделай 256 базовых цветов, из них и выбирай. По крайней мере, обязательно нужно уйти от модели RGB. Можно, например, HSV использовать… // а, увидел, тут уже HSV используется.. Ну, а ГСЧ все-таки должен быть аппаратным. Можно копить энтропию из промежутков между внешними прерываниями, АЦП (как я уже говорил), еще чего-нибудь.. Абы источников случайных величин было как можно больше. Тогда получим примерно гауссиану. Ее при помощи математики легко в равномерное распределение преобразовать.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
антенна на канале АЦП будет давать четкую корелляцию с сетью. поскольку в моем устройстве идет привязка к интервалам по 10 мс, сомневаюсь, что эта идея даст хоть сколько-нибудь лучший результат, чем то, что есть сейчас...
не нужна истинная случайность, я уже говорил. нужна простая, "человеческая", красивая последовательность, которую просто сложно предсказать зрителю
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Ну так псевдослучайные числа - на то и псевдослучайные, что фигня полная… Можно фликкер-шум использовать. Там, правда, 1/f, но все лучше, чем псевдослучайные числа.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
А если считать хеш-функцию от текущего цвета и принимать результат за новый цвет? Если цвет 24 битный, то можно crc32 использовать, и обнулять младший или старший байт. На выбор.
если кажется, что рандом неправильный - исправь! крути доску как одинокий шахматист: Учет=рнд(х), Унечет=(рнд(х)+х/2)%х или на треть оборота - также, только добавляй поочереди 0, х/3, 2х/3... и твои рядомстоящие результаты окажутся совсем не рядом
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
продолжать выбивать случайные числа, пока выпавшее значение не станет отличаться от текущего цвета/номера более некоторой дельты - самое то имхо
нет, это плохо: слишком недетерминированная длительность генерации числа в этом случае. мои эксперименты показывают, что подряд может быть больше десятка "близких" чисел.
Ivanoff-iv писал(а):
крути доску как одинокий шахматист
уже интересней... попробую экспериментально проверить, как это скажется на наблюдаемый результат.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 244
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения