powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как повысить "мощность" Rnd -- с Single до Double?
25 сообщений из 60, страница 1 из 3
Как повысить "мощность" Rnd -- с Single до Double?
    #39997259
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть генератор (псевдо-)случайных чисел (назовём его Rnd), возвращающий число Х типа Single. А поскольку это число 0<=Х<1, то "мощность" этого датчика равна "мощности" мантиссы типа Single, то есть 2^24 (~ 16 миллионов).

Это означает, что "исчерпав" эти 2^24 мантисс, датчик "идёт на второй круг". А поскольку последовательность его результатов определена рекуррентно, то он в точности повторяет ее.

Вопрос: как можно наиболее изящным способом повысить "мощность" последовательности (псевдо-)случайных чисел до "мощности" мантиссы типа Double, то есть 2^52?

Ну или если не совсем до ^52, то хотя бы просто существенно...

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

(извиняюсь за глупые вопросы, не силен в теории ГПСЧ)
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997288
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1,

одна и та же - в том смысле, что следующее число, получаемое от Rnd, полностью определяется предыдущим (полученным) числом. Но мы, конечно, можем "стартануть" эту последовательность с любого числа -- вызвав с отрицательным аргументом -- типа

Rnd(-х0)

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


-- нет, в том языке, о котором я говорю (а это VB), этот генератор -- Rnd - единственный. Мы можем только заставить -- более или менее грубо -- его перескочить в другую точку "ряда" псевдо-случайных чисел, по которому (ряду) он будет дальше шпарить.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997293
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
Это означает, что "исчерпав" эти 2^24 мантисс, датчик "идёт на второй круг"
Рассмотрим предельный случай случайной битовой последовательности. Возможных значений - всего два, а "мощность" последовательности - сильно больше.

P.S.
Рассмотрение граничных и запредельных случаев иногда позволяет не попадать в очевидные ловушки.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997294
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

вы красиво резанули, только не раскрыли, кто и как генерит это случайную битовую последовательность.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997304
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван 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 используйте, если что :)
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997306
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,

Не нужно заниматься ерундой и изобретать велосипеды, от этого ничего хорошего не выйдет. В Windows уже есть встроенный генератор RND его и надо использовать, если встроенная в VB функция RND не удовлетворяет по каким-то причинам.


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Option Explicit

Private Declare Function CryptAcquireContextW Lib "advapi32.dll" (ByRef phProv As Long, ByVal pszContainer As Long, ByVal pszProvider As Long, ByVal dwProvType As Long, ByVal dwFlags As Long) As Long
Private Declare Function CryptGenRandom Lib "advapi32.dll" (ByVal hProv As Long, ByVal dwLen As Long, ByRef pbBuffer As Any) As Long
Private Declare Function CryptReleaseContext Lib "advapi32.dll" (ByVal hProv As Long, Optional ByVal dwFlags As Long) As Long

Public Function GenRnd() As Long
    Const PROV_RSA_FULL = 1&, CRYPT_VERIFYCONTEXT = &HF0000000
    Dim hProvider As Long

    If CryptAcquireContextW(hProvider, 0&, 0&, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) Then
        If CryptGenRandom(hProvider, 4&, GenRnd) = 0& Then GenRnd = 0&
        hProvider = CryptReleaseContext(hProvider): Debug.Assert hProvider
    End If
End Function
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997315
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я попутался - делители и модули, обычно, просто степень 2
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997320
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
только не раскрыли, кто и как генерит это случайную битовую последовательность.
Чтобы показать вашу исходную ошибку этого не требуется.
Вот чтобы узнать период генератора псевдослучайных чисел вашего VB, да - требуется документация.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997325
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov, извинте, ваши реплики не показались мне ни полезными, ни поучительными. Видимо, мне не хватает мозгов.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997330
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
не показались
Когда кажется - крестятся. А так - учиться, учиться и ещё раз учиться.
Внутреннее состояние генератора псевдослучайной меняется при каждой итерации и нет никакой очевидной связи между периодом псевдослучайной последовательности и диапазоном возможных значений, которые выдаёт генератор.
Оценка качества конкретного генератора - вопрос совершенно отдельный.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997337
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

вы понимаете, что ГПСЧ, возвращающий значение типа Single не может иметь период больше 2^24 (потому что именно столько разных мантисс у чисел типа Single?

Иметь период меньше 2^24 -- может, конечно. Если он плохой.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997357
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
Basil A. Sidorov,

вы понимаете, что ГПСЧ, возвращающий значение типа Single не может иметь период больше 2^24 (потому что именно столько разных мантисс у чисел типа Single?

Иметь период меньше 2^24 -- может, конечно. Если он плохой.


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

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

если каждое следующее его значение однозначно определяется предыдущим значением? Какие у вас есть варианты ответа на ваш собственный вопрос?


Без если.

Перефразирую Ваше утверждение:
вы понимаете, что ГПСЧ, возвращающий значение типа Single не может иметь период больше 2^24 (потому что именно столько разных мантисс у чисел типа Single?

в:
"вы понимаете, что ГПСЧ, возвращающий 1 бит не может иметь период больше 2^1" (мантиссы опущу).

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

x[n+1]=(A*X[n]+B) mod C

Rnd[n+1]=x[n+1]/C
-- так какие A и B вы посоветуете, чтобы сварганить на коленке ГПСЧ типа Double с "мощностью" (количеством различных вариантов Rnd), скажем, 2^40?

(Понятно, что именно C тут должно быть именно =2^40 ...)

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

да-да, я понимаю, что в каждой реплике мне следовало добавлять

" если каждое следующее его значение однозначно определяется предыдущим значением "
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997388
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
Если он плохой.
Возмите монетку и запишите последовательности "орёл-решка" в десяти сериях из десяти бросков.
Потом найдите идентичные серии и уникальные.
И ещё раз задайтесь вопросом нехватки собственных мозгов.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997391
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS

Или где такие "хорошие" числа можно откопать?


В интернете, естественно. Для 40бит, скорее всего, придется свое исследование делать, для 48 бит:
A=44485709377909
B=11863279
С=2^48
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997395
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
x1ca4064,

да-да, я понимаю, что в каждой реплике мне следовало добавлять

" если каждое следующее его значение однозначно определяется предыдущим значением "


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

Например, если я возьму самый банальный ГПСЧ (мой Rnd с "мощностью" ~16 000 000), и добавлю к нему счётчик его вызовов N, и буду в качестве случайного числа использовать

rnd1 = дробная_часть(Rnd +1/CDbl(N) )

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

rnd1 = дробная_часть(Rnd +1/CDbl(N) )

-- то такой модифицированный ГПСЧ будет работать, формально говоря, не зацикливаясь, хотя "на втором круге" датчика Rnd -- rnd1 будет уже мало отличаться от значений, возвращаемых этим самым Rnd ....


Скорее всего, такой генератор уже не будет давать равномерное распределение, при его использовании можно получить неожиданные артефакты.
В любом случаи, если "придумался" генератор, нужно анализировать его свойства перед использованием.
Кстати, числа x[n] - целые - на всякий случай.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997406
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,

А зачем вся эта возня с VB Rnd? Какая конечная цель?
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39997407
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x1ca4064
A=44485709377909
B=11863279
С=2^48
-- это для скольки-битной арифметики константы?
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 1 из 3
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как повысить "мощность" Rnd -- с Single до Double?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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