|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Есть генератор (псевдо-)случайных чисел (назовём его Rnd), возвращающий число Х типа Single. А поскольку это число 0<=Х<1, то "мощность" этого датчика равна "мощности" мантиссы типа Single, то есть 2^24 (~ 16 миллионов). Это означает, что "исчерпав" эти 2^24 мантисс, датчик "идёт на второй круг". А поскольку последовательность его результатов определена рекуррентно, то он в точности повторяет ее. Вопрос: как можно наиболее изящным способом повысить "мощность" последовательности (псевдо-)случайных чисел до "мощности" мантиссы типа Double, то есть 2^52? Ну или если не совсем до ^52, то хотя бы просто существенно... У меня есть задумка, что, наверное, это можно сделать, накапливая по ходу генерации чисел (исходным датчиком Rnd) некую "статистику" этого потока (просто интеграл, то есть сумму?) и как-то подмешивая эту статистику к очередным генерируемым числам ... Но как именно -- мозгов не хватает придумать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 14:05 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS А поскольку последовательность его результатов определена рекуррентно, то он в точности повторяет ее. (извиняюсь за глупые вопросы, не силен в теории ГПСЧ) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 14:24 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Имя пользователя1, одна и та же - в том смысле, что следующее число, получаемое от Rnd, полностью определяется предыдущим (полученным) числом. Но мы, конечно, можем "стартануть" эту последовательность с любого числа -- вызвав с отрицательным аргументом -- типа Rnd(-х0) -- причём х0 может быть любого типа, не обязательно Single, но все возвращаемые случайные числа, конечно, будут Single. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 14:31 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Имя пользователя1 можно ли создать два независимых генератора с разными последовательностями -- нет, в том языке, о котором я говорю (а это VB), этот генератор -- Rnd - единственный. Мы можем только заставить -- более или менее грубо -- его перескочить в другую точку "ряда" псевдо-случайных чисел, по которому (ряду) он будет дальше шпарить. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 14:35 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS Это означает, что "исчерпав" эти 2^24 мантисс, датчик "идёт на второй круг" P.S. Рассмотрение граничных и запредельных случаев иногда позволяет не попадать в очевидные ловушки. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 14:36 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, вы красиво резанули, только не раскрыли, кто и как генерит это случайную битовую последовательность. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 14:39 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS Вопрос: как можно наиболее изящным способом повысить "мощность" последовательности (псевдо-)случайных чисел до "мощности" мантиссы типа Double, то есть 2^52? Ну или если не совсем до ^52, то хотя бы просто существенно... У меня есть задумка, что, наверное, это можно сделать, накапливая по ходу генерации чисел (исходным датчиком Rnd) некую "статистику" этого потока (просто интеграл, то есть сумму?) и как-то подмешивая эту статистику к очередным генерируемым числам ... Но как именно -- мозгов не хватает придумать. 1. Почитайте про линейные конгруэнтные генераторы: x[n+1]=(A*X[n]+B) mod C Rnd[n+1]=x[n+1]/C нужно правильно выбрать параметры A,B,C и алгоритм инициализации (x[0]), обычно, A,B взаимно просты, C-степень 2 минус 1) 2. Почитайте про конгруэнтные генераторы более высоких порядков 3. Можно взять блочный шифр, выбрать начальное значение и ключ, затем: x[n+1]=Crypt(x[n],Key] Rnd[n+1]=x[n+1]/(2^BlockSize-1) свойства генератора лучше проверить - есть всякие тесты 4. GUID используйте, если что :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 14:48 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS, Не нужно заниматься ерундой и изобретать велосипеды, от этого ничего хорошего не выйдет. В Windows уже есть встроенный генератор RND его и надо использовать, если встроенная в VB функция RND не удовлетворяет по каким-то причинам. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 14:51 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Что-то я попутался - делители и модули, обычно, просто степень 2 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 15:01 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS только не раскрыли, кто и как генерит это случайную битовую последовательность. Вот чтобы узнать период генератора псевдослучайных чисел вашего VB, да - требуется документация. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 15:05 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, извинте, ваши реплики не показались мне ни полезными, ни поучительными. Видимо, мне не хватает мозгов. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 15:12 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS не показались Внутреннее состояние генератора псевдослучайной меняется при каждой итерации и нет никакой очевидной связи между периодом псевдослучайной последовательности и диапазоном возможных значений, которые выдаёт генератор. Оценка качества конкретного генератора - вопрос совершенно отдельный. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 15:23 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, вы понимаете, что ГПСЧ, возвращающий значение типа Single не может иметь период больше 2^24 (потому что именно столько разных мантисс у чисел типа Single? Иметь период меньше 2^24 -- может, конечно. Если он плохой. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 15:34 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS Basil A. Sidorov, вы понимаете, что ГПСЧ, возвращающий значение типа Single не может иметь период больше 2^24 (потому что именно столько разных мантисс у чисел типа Single? Иметь период меньше 2^24 -- может, конечно. Если он плохой. Легко может, рассмотрите, как пример, однобитный генератор (который возвращает 1 бит). каков его период? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 15:50 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
x1ca4064, если каждое следующее его значение однозначно определяется предыдущим значением? Какие у вас есть варианты ответа на ваш собственный вопрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 15:59 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS x1ca4064, если каждое следующее его значение однозначно определяется предыдущим значением? Какие у вас есть варианты ответа на ваш собственный вопрос? Без если. Перефразирую Ваше утверждение: вы понимаете, что ГПСЧ, возвращающий значение типа Single не может иметь период больше 2^24 (потому что именно столько разных мантисс у чисел типа Single? в: "вы понимаете, что ГПСЧ, возвращающий 1 бит не может иметь период больше 2^1" (мантиссы опущу). Ошибочность видна? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 16:16 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
x1ca4064 Почитайте про линейные конгруэнтные генераторы: x[n+1]=(A*X[n]+B) mod C Rnd[n+1]=x[n+1]/C (Понятно, что именно C тут должно быть именно =2^40 ...) Или где такие "хорошие" числа можно откопать? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 16:18 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
x1ca4064, да-да, я понимаю, что в каждой реплике мне следовало добавлять " если каждое следующее его значение однозначно определяется предыдущим значением " ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 16:20 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS Если он плохой. Потом найдите идентичные серии и уникальные. И ещё раз задайтесь вопросом нехватки собственных мозгов. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 16:39 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS Или где такие "хорошие" числа можно откопать? В интернете, естественно. Для 40бит, скорее всего, придется свое исследование делать, для 48 бит: A=44485709377909 B=11863279 С=2^48 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 16:48 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS x1ca4064, да-да, я понимаю, что в каждой реплике мне следовало добавлять " если каждое следующее его значение однозначно определяется предыдущим значением " Лучше разделять "состояние" и "значение", иначе, формулировки будут кривые ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 16:52 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Но я всё-таки хотел бы додумать до конца исходную постановку задачи. Например, если я возьму самый банальный ГПСЧ (мой Rnd с "мощностью" ~16 000 000), и добавлю к нему счётчик его вызовов N, и буду в качестве случайного числа использовать rnd1 = дробная_часть(Rnd +1/CDbl(N) ) -- то такой модифицированный ГПСЧ будет работать, формально говоря, не зацикливаясь, хотя "на втором круге" датчика Rnd -- rnd1 будет уже мало отличаться от значений, возвращаемых этим самым Rnd .... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 16:59 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS rnd1 = дробная_часть(Rnd +1/CDbl(N) ) -- то такой модифицированный ГПСЧ будет работать, формально говоря, не зацикливаясь, хотя "на втором круге" датчика Rnd -- rnd1 будет уже мало отличаться от значений, возвращаемых этим самым Rnd .... Скорее всего, такой генератор уже не будет давать равномерное распределение, при его использовании можно получить неожиданные артефакты. В любом случаи, если "придумался" генератор, нужно анализировать его свойства перед использованием. Кстати, числа x[n] - целые - на всякий случай. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 17:08 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS, А зачем вся эта возня с VB Rnd? Какая конечная цель? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 17:22 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
x1ca4064 A=44485709377909 B=11863279 С=2^48 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 17:26 |
|
Как повысить "мощность" 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 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 10:21 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Eolt А битовые операции? SHL, SHR, AND/OR/XOR ? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 10:54 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 11:02 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Спасибо коту с сигаретой. Автор вобщем тебе можем насетапить любой генератор какой хочешь. Инфа - сотка. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 11:10 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Снова понадобился датчик случайных чисел. Перечитал ветку, и после этого не успел даже начать размышлять, как всплыло решение: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
-- замечу, что в потоке генерируемых чисел значения будут повторяться, но сама последовательность чисел "зациклится" только через 2^32 шагов. Видно, что здесь Rnd используется только для производства каждого конкретного случайного числа, а за внутреннее состояние датчика (и его модификацию) отвечает longinnerstate (и его инкрементация) Без "+ Rnd" в последней формуле последовательность выдаваемых чисел выглядит как монотонно убывающая. Понятно, что когда-то она скакнёт вверх, но меня такое поведение всё равно не устраивает, так что пришлось вписать "+ Rnd". ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 08:10 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
повторяться будут и внутри скобок (потеря точности) (-Abs(CSng(longinnerstate) + Rnd)) longinnerstate=1^9 Rnd=0.9 И "LET" для простых переменных можно не писать уже больше 30лет. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 14:55 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
имел ввиду миллиард, как здесь (да и для 100млн тоже) exp98 повторяться будут и внутри скобок (потеря точности) (-Abs(CSng(longinnerstate) + Rnd)) longinnerstate=10^9 Rnd=0.9 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 17:16 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
exp98, да, спасибо, значит нужно поставить "* Rnd" вместо "+ Rnd". А Let я пишу, потому что мне ндравится . ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 18:47 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS значит нужно поставить "* Rnd" вместо "+ Rnd". В простых случаях известны распределения для (X+Y) и (X*Y) случ-х независимых величин. 1) Уже говорили про X+Y, когда обе имеют р.р. на [a; b] - тогда имеем треугольник или разновидность трапеции, когда отрезки разные, или даже 2-х модовую трапецию. Имеем различную частоту выпадания значения t=(X+Y) 2) Пусть X, Y р.р. на [0; a] (вариант попроще), тогда (X*Y) имеет пл.распр. p(t)= Ln(a^2/t)/a^2 на ]0; a^2]. Т.о., она линейно убывает от Ln(t), причём p(a^2)= 0, p(0+) -->беск. Имеем криволинейный треугольник и тоже различную частоту выпадания (X*Y). 3) Пусть Y р.р. на [a; b], а X имеет абсолютно непрерывную ф-цию распр F(t). Тогда (X+Y) имеет пл.распр. p(t)= (F(t-a) - F(t-b))/(b-a). Любая ф.р. всегда сигмоидна (в частности, для р.р. она линейна только на отрезке, а вне его постоянна). Она не обязательно имеет линейные участки, поэтому и p(t), будучи dF(t)/dt, не обязана быть const. Опять имеем различную частоту выпадания (X+Y). В этом варианте для ГПСЧ нужно выбирать участки значений t, где F(t) ведёт себя как можно более линейно (как у р.р. , и даже наклон как у р.р. ), пока это приемлемо. Впрочем точно так же как и в остальных случаях. Но если F(t) где-то линейно, то там же его плотносоть ~const. П.С. Всех с праздниками, к кому это относится. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2021, 17:08 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
Иван FXS, охо-хо-хо, ММК на стандартном генераторе это нечто потратьте время, переведите хоть один из нормальных генераторов, тынц там для линейного распределения ещё есть варианты PS: для ММК используются генераторы для линейного распределения, выдавающие значения (0..1], а не [0..1) как в стандартных либах ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 17:51 |
|
Как повысить "мощность" Rnd -- с Single до Double?
|
|||
---|---|---|---|
#18+
x1ca4064 1. Почитайте про линейные конгруэнтные генераторы: x[n+1]=(A*X[n]+B) mod C Rnd[n+1]=x[n+1]/C нужно правильно выбрать параметры A,B,C и алгоритм инициализации (x[0]), обычно, A,B взаимно просты, C-степень 2 минус 1) x1ca4064 A=44485709377909 B=11863279 С=2^48 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 15:26 |
|
|
start [/forum/topic.php?all=1&fid=16&tid=1339596]: |
0ms |
get settings: |
27ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
944ms |
get tp. blocked users: |
2ms |
others: | 379ms |
total: | 1428ms |
0 / 0 |