powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как повысить "мощность" Rnd -- с Single до Double?
60 сообщений из 60, показаны все 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
Как повысить "мощность" 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
Как повысить "мощность" Rnd -- с Single до Double?
    #39998226
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt
mayton
А как бейсик вообще работает с целыми числами?


Список типов есть тут

А битовые операции? SHL, SHR, AND/OR/XOR ?
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #39998229
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

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

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

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Public Function myRnd2021(Optional initval) As Single
If Not IsMissing(initval) Then
    Static longinnerstate As Long
    Let longinnerstate = CLng(initval)
    Call Rnd(-1)
End If

If longinnerstate = 2147483647 Then Let longinnerstate = -2147483647
Let longinnerstate = longinnerstate + 1

Let myRnd2021 = Rnd(-Abs(CSng(longinnerstate) + Rnd))
End Function

-- замечу, что в потоке генерируемых чисел значения будут повторяться, но сама последовательность чисел "зациклится" только через 2^32 шагов.

Видно, что здесь Rnd используется только для производства каждого конкретного случайного числа, а за внутреннее состояние датчика (и его модификацию) отвечает longinnerstate (и его инкрементация)

Без "+ Rnd" в последней формуле последовательность выдаваемых чисел выглядит как монотонно убывающая. Понятно, что когда-то она скакнёт вверх, но меня такое поведение всё равно не устраивает, так что пришлось вписать "+ Rnd".
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #40066378
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
повторяться будут и внутри скобок (потеря точности)
(-Abs(CSng(longinnerstate) + Rnd))
longinnerstate=1^9
Rnd=0.9

И "LET" для простых переменных можно не писать уже больше 30лет.
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #40066419
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имел ввиду миллиард, как здесь (да и для 100млн тоже)
exp98
повторяться будут и внутри скобок (потеря точности)
(-Abs(CSng(longinnerstate) + Rnd))
longinnerstate=10^9
Rnd=0.9
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #40066463
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98, да, спасибо, значит нужно поставить "* Rnd" вместо "+ Rnd".

А Let я пишу, потому что мне ндравится .
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #40067947
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
значит нужно поставить "* Rnd" вместо "+ Rnd".
Вот на всякий случай вместе 3 предостережения к самоделкам ГПСЧ.
В простых случаях известны распределения для (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.

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

охо-хо-хо, ММК на стандартном генераторе это нечто

потратьте время, переведите хоть один из нормальных генераторов, тынц

там для линейного распределения ещё есть варианты

PS: для ММК используются генераторы для линейного распределения, выдавающие значения (0..1], а не [0..1) как в стандартных либах
...
Рейтинг: 0 / 0
Как повысить "мощность" Rnd -- с Single до Double?
    #40126030
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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)
-- правильно ли я понимаю, что уточнение "C-степень 2 минус 1" вводит в заблуждение, и С вполне может быть степенью двойки? И, в частности, ниже вы предложили вариант параметров:
x1ca4064
A=44485709377909
B=11863279
С=2^48
-- в котором используется именно такая степень (т.е. единица из неё не вычитается)?
...
Рейтинг: 0 / 0
60 сообщений из 60, показаны все 3 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как повысить "мощность" Rnd -- с Single до Double?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (11): Анонимы (8), Yandex Bot 1 мин., Google Bot 3 мин., Bing Bot 5 мин.
x
x
Закрыть


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