|
Как повысить "мощность" 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 |
|
|
start [/forum/topic.php?fid=16&msg=39997325&tid=1339596]: |
0ms |
get settings: |
7ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
33ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
413ms |
get tp. blocked users: |
0ms |
others: | 419ms |
total: | 884ms |
0 / 0 |