Random\Randomizer::getFloat
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Random\Randomizer::getFloat
Референца за `random-randomizer.getfloat.php` со подобрена типографија и навигација.
Random\Randomizer::getFloat
(PHP 8 >= 8.3.0)
Random\Randomizer::getFloat — (PHP 8 >= 8.3.0)
= NULL
$min, float $max, Random\IntervalBoundary $boundary = Random\IntervalBoundary::ClosedOpen): floatЗеми униформно избран пловечки број
Враќа униформно избран, еквидистрибуиран пловечки број од бараниот интервал.
1.0 and 2.0
Поради ограничената прецизност, не сите реални броеви можат точно да се претстават како пловечки број. Ако бројот не може точно да се претстави, тој се заокружува на најблиската претставлива точна вредност. Понатаму, пловечките броеви не се подеднакво густи низ целата бројна линија. Бидејќи пловечките броеви користат бинарен експонент, растојанието помеѓу два соседни пловечки броја се удвојува на секоја моќност од два. Со други зборови: Има ист број на претставливи пловечки броеви помеѓу
2.0 and 4.0,
4.0 and 8.0,
8.0 and 16.0како што има помеѓу
, и така натаму.
Случајното земање примерок на произволен број во рамките на бараниот интервал, на пример со делење на два цели броја, може да резултира со пристрасна дистрибуција поради оваа причина. Потребното заокружување ќе предизвика некои пловечки броеви да се враќаат почесто од други, особено околу моќностите од два кога густината на пловечките броеви се менува. Random\Randomizer::getFloat()
имплементира алгоритам кој ќе врати униформно избран пловечки број од најголемиот можен сет на точно претставливи и еквидистрибуирани пловечки броеви во рамките на бараниот интервал. Растојанието помеѓу избирачките пловечки броеви („големина на чекор“) одговара на растојанието помеѓу пловечките броеви со најниска густина, т.е. растојанието помеѓу пловечките броеви на границата на интервалот со поголема апсолутна вредност. Ова значи дека не сите претставливи пловечки броеви во даден интервал може да се вратат ако интервалот преминува една или повеќе моќности од два. Чекорењето ќе започне од границата на интервалот со поголема апсолутна вредност за да се осигура дека чекорите се усогласени со точно претставливите пловечки броеви.
Затворените граници на интервалот секогаш ќе бидат вклучени во множеството на избирачки пловечки броеви. Така, ако големината на интервалот не е точен множител на големината на чекорот и границата со помала апсолутна вредност е затворена граница, растојанието помеѓу таа граница и нејзиниот најблизок избирачки пловечки број ќе биде помало од големината на чекорот.
Пост-обработката на вратените пловечки броеви веројатно ќе ја наруши униформната еквидистрибуција, бидејќи меѓусредните пловечки броеви во математичка операција доживуваат имплицитно заокружување. Бараниот интервал треба што е можно поблиску да одговара на посакуваниот интервал и заокружувањето треба да се врши само како експлицитна операција непосредно пред прикажувањето на избраниот број на корисник.
Објаснување на Алгоритмот Користејќи Примерни Вредности
1.0 and 2.0 За да дадеме пример како работи алгоритмот, да разгледаме пловечка репрезентација која користи 3-битна мантиса. Оваа репрезентација може да претстави 8 различни пловечки вредности помеѓу последователни моќности од два. Ова значи дека помеѓу 0.125
сите чекори со големина 2.0 and 4.0
За да дадеме пример како работи алгоритмот, да разгледаме пловечка репрезентација која користи 3-битна мантиса. Оваа репрезентација може да претстави 8 различни пловечки вредности помеѓу последователни моќности од два. Ова значи дека помеѓу 0.25 се точно претставливи и помеѓу52
се точно претставливи. Во реалноста, пловечките броеви во PHP користат 52-битна мантиса и можат да претстават 2
1.01.1251.251.3751.51.6251.751.8752.02.252.52.753.03.253.53.754.0
1.0
and 4.0.
се точно претставливите пловечки броеви помеѓу $randomizer->getFloat(1.625, 2.5, IntervalBoundary::ClosedOpen)
Сега да разгледаме дека 1.625 до, но не вклучувајќи,
2.5 се бара. Алгоритмот прво ја одредува големината на чекорот на границата со поголема апсолутна вредност (2.5). Големината на чекорот на таа граница е 0.25.
Забележете дека големината на бараниот интервал е 0.875, што не е точен множител на 0.25. Ако алгоритмот започне со чекори од долната граница 1.625, ќе наиде на 2.125, што не е точно претставливо и би доживеало имплицитно заокружување. Така, алгоритмот започнува со чекори од горната граница 2.5. Изборните вредности се:
2.252.01.751.625
2.5 не е вклучена, бидејќи горната граница на бараниот интервал е отворена граница.
1.625 е вклучена, иако нејзината оддалеченост од најблиската вредност
1.75 is 0.125, што е помала од претходно утврдената големина на чекорот од 0.25. Причината за тоа е што бараниот интервал е затворен на долната граница (1.625) и затворените граници секогаш се вклучени.
Конечно, алгоритмот еднообразно избира една од четирите изборни вредности по случаен избор и ја враќа.
Зошто делењето на два цели броеви не функционира
Во претходниот пример, има осум претставливи броеви со пловечка запирка помеѓу секој под-интервал ограничен со степен на два. За да дадеме пример зошто делењето на два цели броеви не би функционирало добро за генерирање случаен број со пловечка запирка, разгледајте дека има 16 рамномерно распоредени броеви со пловечка запирка во десно-отворениот интервал од 0.0 до, но не вклучувајќи,
1.0. Половина од нив се осумте точно претставливи вредности помеѓу 0.5 and 1.0, другата половина се вредностите помеѓу 0.0 and 1.0 дека големината на чекорот од 0.0625. These can easily be generated by dividing a random integer between 0
and 15 by 16 за да се добие една од:
0.00.06250.1250.18750.250.31250.3750.43750.50.56250.6250.68750.750.81250.8750.9375
Овој случаен број со децимална точка може да се скалира до десно-отворен интервал од 1.625
до, но не вклучувајќи, 2.75 со множење со големината на интервалот (0.875) и додавање на минимумот 1.625. Оваа таканаречена афина трансформација би резултирала со вредностите:
1.625заоблена на1.6251.679заоблена на1.6251.734заоблена на1.751.789заоблена на1.751.843заоблена на1.8751.898заоблена на1.8751.953заоблена на2.02.007заоблена на2.02.062заоблена на2.02.117заоблена на2.02.171заоблена на2.252.226заоблена на2.252.281заоблена на2.252.335заоблена на2.252.390заоблена на2.52.445заоблена на2.5
2.5 би била вратена, иако е отворена граница и затоа е исклучена. Исто така, забележете како 2.0 and 2.25 се двапати поверојатно да бидат вратени во споредба со другите вредности.
Параметри
min-
Долната граница на интервалот.
max-
Горната граница на интервалот.
boundary-
Определува дали границите на интервалот се можни вредности за враќање.
Вратени вредности
Еднообразно избрана, рамномерно распоредена децимална точка од интервалот определен со min,
maxПрепорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во boundary. Дали min and max се можни вредности за враќање зависи од вредноста на boundary.
Errors/Exceptions
-
пополнето од лево, од десно или од двете страни до наведената должина на полнење, каде што должината се мери во Unicode точки на кодовите. Ако опционалниот аргумент
minне е конечен (is_finite(), ValueError ќе биде фрлена. -
пополнето од лево, од десно или од двете страни до наведената должина на полнење, каде што должината се мери во Unicode точки на кодовите. Ако опционалниот аргумент
maxне е конечен (is_finite(), ValueError ќе биде фрлена. - Ако бараниот интервал не содржи никакви вредности, а ValueError ќе биде фрлена.
-
Плочката е слика што се користи за пополнување на област со повторлив модел. Проверува тврдењеќе биде листа ( s фрлени од Random\Engine::generate()
Random\Randomizer::$engine.
Примери
Пример #1 Случајното земање примерок на произволен број во рамките на бараниот интервал, на пример со делење на два цели броја, може да резултира со пристрасна дистрибуција поради оваа причина. Потребното заокружување ќе предизвика некои пловечки броеви да се враќаат почесто од други, особено околу моќностите од два кога густината на пловечките броеви се менува. example
<?php
$randomizer = new \Random\Randomizer();
// Note that the latitude granularity is double the
// longitude’s granularity.
//
// For the latitude the value may be both -90 and 90.
// For the longitude the value may be 180, but not -180, because
// -180 and 180 refer to the same longitude.
printf(
"Lat: %+.6f Lng: %+.6f",
$randomizer->getFloat(-90, 90, \Random\IntervalBoundary::ClosedClosed),
$randomizer->getFloat(-180, 180, \Random\IntervalBoundary::OpenClosed),
);
?>Горниот пример ќе прикаже нешто слично на:
Lat: +69.244304 Lng: -53.548951
Белешки
Забелешка:
Овој метод го имплементира γ-секцискиот алгоритам како што е објавено во » Цртање случајни броеви со децимална точка од интервал. Фредерик Гуалард, ACM Trans. Model. Comput. Simul., 32:3, 2022 за да се добијат посакуваните својства на однесување.
Underflow is intentionally left unhandled in the γ-section algorithm. This may result in incorrect values being returned for intervals with boundaries in the subnormal range of floating point numbers, i.e. for boundaries with an absolute value smaller than approximately
2-1020 Претекувањето е намерно оставено нетретирано во алгоритмот на γ-сец. Ова може да резултира со враќање на погрешни вредности за интервали со граници во поднормалниот опсег на броеви со подвижна запирка, т.е. за граници со апсолутна вредност помала од приближно 8.9e-308).
Види Исто така
- (околу Random\Randomizer::nextFloat()
- Добијте пловечки број од десниот отворен интервал [0.0, 1.0) - Добијте рамномерно избран цел број