|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Eolt, чтобы датчик не зацикливался. (Я увидел ваше предложение с CryptReleaseContext и верю, что она работает ... просто оно меня слегка напугало.) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 17:29 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS x1ca4064 A=44485709377909 B=11863279 С=2^48 48 и более, 64 бит в самый раз! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 17:38 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS, хм. Странно что в VBasic не включили линейный конгруэнтный. Можно попробовать уйти от арифметики битов и заменить ее десятичной арифметикой. Например. Чем отличаются single (float) и double? Double просто более точный. Тоесть если взять сумму двух случайных величин типа RND() и RND() * K то мы получим более точную случайную величину. Надо только расчитать нужный нам десятичный коеффициент К. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 19:10 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
mayton, взятое отдельно, Rnd повторяется через 2^24 вызовов (~16 миллионов). Если мы будем тратить по два вызова Rnd на свое SuperRnd, то "зацикливание" просто произойдёт раньше -- через 8 миллионов SuperRnd ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 19:18 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Вставляй холостой вызов. Цикл станет длинее. У тебя появятся сочетания которых раньше не было. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 19:40 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
mayton Иван FXS, хм. Странно что в VBasic не включили линейный конгруэнтный. VB RND он и есть. LCG, алгоритм Вихрь Мерсена (Mersenne twister, MT), период 2^24. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 20:09 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
У меня простой вопрос: Зачем? Зачем случайное число в диапазоне 0...1 должно быть не 7 знаков после запятой, а 15 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 20:12 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Dima T, если работать не с отдельным случайным числом, а с их последовательностью, то иногда бывает важно, чтобы эта последовательность не зацикливалась так часто -- всего через 16 миллионов шагов. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 20:18 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS Dima T, если работать не с отдельным случайным числом, а с их последовательностью, то иногда бывает важно, чтобы эта последовательность не зацикливалась так часто -- всего через 16 миллионов шагов. Разрядность и цикличность это разные вещи. Обычно ГПСЧ возвращают половину разрядности, т.е. например для разрядности 16 байт используются 32-хбайтовые переменные. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 20:29 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS иногда бывает важно, чтобы эта последовательность не зацикливалась так часто -- всего через 16 миллионов шагов. VB RND не предназначен для генерации длинных последовательностей. Эта реализация МТ появилась в рантайме VB6/VBA в 1998 году. Тогда большинство компьютеров были 486, и нужен был быстрый алгоритм который мог работать на тех слабых процессорах. Поэтому решили, что скорость работы важнее, чем возможность использования RND в статистических или криптографических расчетах. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 21:04 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Eolt Тогда большинство компьютеров были 486 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2020, 09:57 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Если в бейсике есть арифметика целых чисел - то давайте сделаем линейный генератор и выход его завернём в тип double. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2020, 10:54 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
mayton Если в бейсике есть арифметика целых чисел - то давайте сделаем линейный генератор и выход его завернём в тип double. Сами вы ничего путного не сделаете, нет соответствующих математических знаний. Поэтому надо использовать вариант который официально предлагает Microsoft для таких случаев. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2020, 11:02 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
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.
Насчет периода - не помню. Надо посмотреть откуда мы брали эти коэффициенты. Вот Siemargl делал свои оптимизации. Со свдигами. "C" Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Вот Дима делал. Под мультипоточку. Тут помню мы еще словили несколько забавных артефактов из которых следовало что нужно было уйти от встроенного генератора. Вот. Был использовал thread_local. Тоже вариант. Ну... ябы просто каждому потоку отдал свой экземпляр автомата ГПСЧ. Благо он дешевый в ресурсах. Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2020, 11:39 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
По поводу криптостойкости автор вроде ничего не говорил. Его интересовал просто период. А увеличение периода - это еще не криптостойкость. Это возможно один из множества параметров ГПСЧ. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2020, 11:47 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
mayton Если в бейсике есть арифметика целых чисел ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2020, 12:42 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Если мы готовы обсуждать случайные числа типа Double, а Rnd возвращает числа типа Single, -- то формально поставленную мной задачу: чтобы ряд чисел "не зацикливался" можно решить просто добавляя в последовательность чисел некую "соль" -- слагаемое, выходящее за пределы точности мантиссы Single (но входящее в пределы точности мантиссы Double), и увеличивая/изменяя её (соль) "на один бит" после каждых 2^24 вызовов Rnd... Но, конечно же, содержательно это не то, чего я взыскую. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2020, 02:11 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS Если мы готовы обсуждать случайные числа типа Double, а Rnd возвращает числа типа Single, -- то формально поставленную мной задачу: чтобы ряд чисел "не зацикливался" можно решить просто добавляя в последовательность чисел некую "соль" -- слагаемое, выходящее за пределы точности мантиссы Single (но входящее в пределы точности мантиссы Double), и увеличивая/изменяя её (соль) "на один бит" после каждых 2^24 вызовов Rnd... Но, конечно же, содержательно это не то, чего я взыскую. Тяжело Вас понять: есть куча разных генераторов, можно использовать любой! Не важно, какой тип возвращает генератор, важно, сколькими битами описывается его состояние. Rnd имеет период 2^24 не потому, что возвращает Single, а потому, что его состояние описывается 24 битами. Если хотите, чтобы "не зацикливался", нужен источник энтропии. Например, можно по таймеру каждые 10мс читать младший бит RDTSC, в результате через 240мс будет 24 _случайных_ бита, после делаете xor с RandomSeed. Не зациклится, но и не повторится, если не сохранять историю этих случайных бит. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2020, 03:07 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
А как бейсик вообще работает с целыми числами? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2020, 08:00 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Сказали уже или нет? Добавлять не просто число, т.е. это не сложение. Второе из них использовать как продолжение мантиссы. Получатся случайные комбинации пар. Колво комбинаций можно подсчитать. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2020, 13:48 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Да. Складывать нельзя. Иначе получим трехполосную гистограмку. Надо старшие младшие разряды инициализировать первым числом. А младшие другим. И для увеличения цикл использовать несколько экземпляров random-generators подмешивая их как соль. Обновлять их с разным периодом. 2,3,5 например. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2020, 14:21 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
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, но я им никогда не пользовался. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2020, 16:09 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
booby, если есть Long - 4 байта то давайте им воспользуемся. Я думаю нам его будет достаточно чтобы решить эту задачу. Нам понадобятся операции *, +, % из С++ подобных языков и такая-же семантика знакового бита. И потом сконвертировать результат в целочисленную сетку разрядов double. Ну и нормировать если надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 12:51 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Капец, дали уже правильный ответ: https://www.cyberforum.ru/post13216903.html https://forum.sources.ru/index.php?showtopic=396944&st=0 Почитайте эти темы, там видно что это и есть линейно-конгруэнтный метод. Повысить период также можно за счет использования чисел большей разрядности (к примеру Currency). Можно сделать вихрь Мерсена (MT19937, период которого составляет 219937 − 1) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 20:55 |
|
|
start [/forum/topic.php?fid=16&msg=39997433&tid=1339596]: |
0ms |
get settings: |
4ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
42ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
426ms |
get tp. blocked users: |
0ms |
others: | 360ms |
total: | 843ms |
0 / 0 |