powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как повысить "мощность" Rnd -- с Single до Double?
10 сообщений из 60, страница 3 из 3
Как повысить "мощность" 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
10 сообщений из 60, страница 3 из 3
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как повысить "мощность" Rnd -- с Single до Double?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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