powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как повысить "мощность" Rnd -- с Single до Double?
25 сообщений из 60, страница 2 из 3
Как повысить "мощность" Rnd -- с Single до Double?
    #39997408
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt,

чтобы датчик не зацикливался.

(Я увидел ваше предложение с CryptReleaseContext и верю, что она работает ... просто оно меня слегка напугало.)
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997412
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
x1ca4064
A=44485709377909
B=11863279
С=2^48
-- это для скольки-битной арифметики константы?

48 и более, 64 бит в самый раз!
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997431
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS, хм. Странно что в VBasic не включили линейный конгруэнтный.

Можно попробовать уйти от арифметики битов и заменить ее десятичной арифметикой.

Например. Чем отличаются single (float) и double? Double просто более точный.

Тоесть если взять сумму двух случайных величин типа RND() и RND() * K
то мы получим более точную случайную величину.

Надо только расчитать нужный нам десятичный коеффициент К.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997433
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

взятое отдельно, Rnd повторяется через 2^24 вызовов (~16 миллионов). Если мы будем тратить по два вызова Rnd на свое SuperRnd, то "зацикливание" просто произойдёт раньше -- через 8 миллионов SuperRnd
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997436
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вставляй холостой вызов. Цикл станет длинее.

У тебя появятся сочетания которых раньше не было.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997445
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Иван FXS, хм. Странно что в VBasic не включили линейный конгруэнтный.


VB RND он и есть. LCG, алгоритм Вихрь Мерсена (Mersenne twister, MT), период 2^24.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997447
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня простой вопрос: Зачем?

Зачем случайное число в диапазоне 0...1 должно быть не 7 знаков после запятой, а 15 ?
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997450
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

если работать не с отдельным случайным числом, а с их последовательностью, то иногда бывает важно, чтобы эта последовательность не зацикливалась так часто -- всего через 16 миллионов шагов.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997455
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
Dima T,

если работать не с отдельным случайным числом, а с их последовательностью, то иногда бывает важно, чтобы эта последовательность не зацикливалась так часто -- всего через 16 миллионов шагов.

Разрядность и цикличность это разные вещи. Обычно ГПСЧ возвращают половину разрядности, т.е. например для разрядности 16 байт используются 32-хбайтовые переменные.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997467
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
иногда бывает важно, чтобы эта последовательность не зацикливалась так часто -- всего через 16 миллионов шагов.


VB RND не предназначен для генерации длинных последовательностей. Эта реализация МТ появилась в рантайме VB6/VBA в 1998 году.
Тогда большинство компьютеров были 486, и нужен был быстрый алгоритм который мог работать на тех слабых процессорах.
Поэтому решили, что скорость работы важнее, чем возможность использования RND в статистических или криптографических расчетах.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997536
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt
Тогда большинство компьютеров были 486
--да, 32-битные...
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997563
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в бейсике есть арифметика целых чисел - то давайте сделаем линейный генератор и выход
его завернём в тип double.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997566
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Если в бейсике есть арифметика целых чисел - то давайте сделаем линейный генератор и выход
его завернём в тип double.


Сами вы ничего путного не сделаете, нет соответствующих математических знаний.
Поэтому надо использовать вариант который официально предлагает Microsoft для таких случаев.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997575
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt
mayton
Если в бейсике есть арифметика целых чисел - то давайте сделаем линейный генератор и выход
его завернём в тип double.


Сами вы ничего путного не сделаете, нет соответствующих математических знаний.
Поэтому надо использовать вариант который официально предлагает Microsoft для таких случаев.

Почему. Уже делали.

В этом топике мы использовали линейный
https://www.sql.ru/forum/1173809/tyapnichnyy-benchmark-cpu-part-1

Java
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
    static final int M = 1_048_576; // 2^20
    static final int J = 2_045;
    int oldI = 12357;

    double Random() {
        oldI = (oldI * J + 1) % M;
        return (double) oldI / M;
    }



Насчет периода - не помню. Надо посмотреть откуда мы брали эти коэффициенты.

Вот Siemargl делал свои оптимизации. Со свдигами.

"C"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
//Marsaglia's MWC (multiply with carry) algorithm
static uint32_t m_z = 333, m_w = 888;  // any seeds not null
uint32_t GetUint()
{
    m_z = 36969 * (m_z & 65535) + (m_z >> 16);
    m_w = 18000 * (m_w & 65535) + (m_w >> 16);
    return (m_z << 16) + m_w;
}



Вот Дима делал. Под мультипоточку. Тут помню мы еще словили несколько забавных артефактов из которых
следовало что нужно было уйти от встроенного генератора. Вот. Был использовал thread_local.

Тоже вариант. Ну... ябы просто каждому потоку отдал свой экземпляр автомата ГПСЧ. Благо он дешевый в ресурсах.

Код: c#
1.
2.
3.
4.
5.
double Random() {
	thread_local uint32_t state = 12345;
	state = state * 1103515245;
	return (double)(state >> 16) / 65536;
}
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997580
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу криптостойкости автор вроде ничего не говорил. Его интересовал просто период.

А увеличение периода - это еще не криптостойкость. Это возможно один из множества
параметров ГПСЧ.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997605
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Если в бейсике есть арифметика целых чисел
-- вишенка на торте: у меня ещё и винда 32-битная ...
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997875
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если мы готовы обсуждать случайные числа типа Double, а Rnd возвращает числа типа Single,

-- то формально поставленную мной задачу: чтобы ряд чисел "не зацикливался"

можно решить просто добавляя в последовательность чисел некую "соль" -- слагаемое, выходящее за пределы точности мантиссы Single (но входящее в пределы точности мантиссы Double), и увеличивая/изменяя её (соль) "на один бит" после каждых 2^24 вызовов Rnd...

Но, конечно же, содержательно это не то, чего я взыскую.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997876
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
Если мы готовы обсуждать случайные числа типа Double, а Rnd возвращает числа типа Single,

-- то формально поставленную мной задачу: чтобы ряд чисел "не зацикливался"

можно решить просто добавляя в последовательность чисел некую "соль" -- слагаемое, выходящее за пределы точности мантиссы Single (но входящее в пределы точности мантиссы Double), и увеличивая/изменяя её (соль) "на один бит" после каждых 2^24 вызовов Rnd...

Но, конечно же, содержательно это не то, чего я взыскую.

Тяжело Вас понять: есть куча разных генераторов, можно использовать любой! Не важно, какой тип возвращает генератор, важно, сколькими битами описывается его состояние. Rnd имеет период 2^24 не потому, что возвращает Single, а потому, что его состояние описывается 24 битами. Если хотите, чтобы "не зацикливался", нужен источник энтропии. Например, можно по таймеру каждые 10мс читать младший бит RDTSC, в результате через 240мс будет 24 _случайных_ бита, после делаете xor с RandomSeed. Не зациклится, но и не повторится, если не сохранять историю этих случайных бит.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997884
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как бейсик вообще работает с целыми числами?
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997910
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сказали уже или нет? Добавлять не просто число, т.е. это не сложение. Второе из них использовать как продолжение мантиссы.
Получатся случайные комбинации пар. Колво комбинаций можно подсчитать.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997918
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Складывать нельзя. Иначе получим трехполосную гистограмку. Надо старшие младшие разряды инициализировать
первым числом. А младшие другим. И для увеличения цикл использовать несколько экземпляров random-generators
подмешивая их как соль. Обновлять их с разным периодом. 2,3,5 например.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997933
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А как бейсик вообще работает с целыми числами?

до 32 разрядов есть явные типы с "машинной" арифметикой
Byte - 1 байт
Integer - 2 байта
Long - 4 байта
Из них беззнаковый только Byte, остальные - знаковые.

Дальше чуть вычурнее.
Есть явно задаваемый тип - знаковый Currency, который внутри 64-битное целое,
и под которым "хорошая" целочисленная арифметика (с малой оговоркой, несущественной в текущем контексте),
но который снаружи всегда выглядит как число с фиксированной точкой с 4мя разрядами после запятой.

Дальше еще вычурнее:
Есть знаковый "недотип" или "полутип" decimal, которым можно пользоваться, но нельзя объявить переменную этого типа.
Хранится он 16-байтных переменных типа Variant, и представляет собой 14-байтную конструкцию из
12-байтного беззнакового целого, байта знака и байта шкалы, указывающей число знаков после запятой
(максимально - 28)
его диапазон - +/-79,228,162,514,264,337,593,543,950,335.
Что превращается при всех 28 использованных знаках после запятой в
+/-7.9228162514264337593543950335
Этот тип считается "медленным", вероятно, ввиду библиотечной реализации его арифметики.
Его главная задача была - быть совместимым с decimal в sql-реализациях сорта Sybase/MS SQL Server
Это максимальная доступная из коробки целочисленная арифметика

В современных версиях на 64-битных платформах доступен знаковый 64-битный longlong,
но я им никогда не пользовался.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39998050
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby, если есть

Long - 4 байта

то давайте им воспользуемся. Я думаю нам его будет достаточно чтобы решить эту задачу.

Нам понадобятся операции *, +, % из С++ подобных языков и такая-же семантика знакового бита.

И потом сконвертировать результат в целочисленную сетку разрядов double. Ну и нормировать если надо.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39998127
ATM-TURBO 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Капец, дали уже правильный ответ:
https://www.cyberforum.ru/post13216903.html
https://forum.sources.ru/index.php?showtopic=396944&st=0
Почитайте эти темы, там видно что это и есть линейно-конгруэнтный метод. Повысить период также можно за счет использования чисел большей разрядности (к примеру Currency). Можно сделать вихрь Мерсена (MT19937, период которого составляет 219937 − 1)
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39998214
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А как бейсик вообще работает с целыми числами?


Список типов есть тут
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 2 из 3
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как повысить "мощность" Rnd -- с Single до Double?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]