Random и Float -
AlexeyTrekkkk - 31.07.2014
Есть функция Random(min, max); возможно ли сделать так, чтобы она выдавала рандомное значение типа Float?
Re: Random и Float -
AlexeyTrekkkk - 31.07.2014
разобрался
Re: Random и Float -
AlexeyTrekkkk - 31.07.2014
а не, помощь все еще нужна.
Re: Random и Float -
stabker - 31.07.2014
pawn Code:
stock Float: floatrandom(Float: fMin, Float: fMax, iDig)
{
iDig = _: floatpower(10.0, iDig);
fMin = Float: (floatround(fMin * Float: iDig));
fMax = Float: (floatround(fMax * Float: iDig));
return (random((_: fMax - _: fMin)) + _: fMin) / Float: iDig;
}
Re: Random и Float -
AlexeyTrekkkk - 31.07.2014
Благодарю
Re: Random и Float -
Diman777 - 08.01.2017
Как раз ищу такую ф-ию. Но не понял зачем 3-ий аргумент? Нельзя без него обойтись?
Если не трудно, объясни, как так получилось, что ф-ия возвращает рандомное? Так бы и сам написал ф-ию, но чё-то не пойму смысла.
Re: Random и Float -
ZiGGi - 09.01.2017
Более оптимальная версия:
PHP Code:
stock Float:frandom(Float:max)
{
return floatdiv(float(random(0)), floatdiv(float(cellmax), max));
}
stock Float:mathfrandom(Float:min, Float:max)
{
return floatadd(frandom(floatsub(max, min)), min);
}
Re: Random и Float -
Diman777 - 09.01.2017
Спасибо ZiGGi, но
stabker объясни потом зачем 3-ий аргумент)
Re: Random и Float -
ZiGGi - 09.01.2017
Quote:
Originally Posted by Diman777
объясни потом зачем 3-ий аргумент)
|
Количество знаков после запятой.
Re: Random и Float -
Stepashka - 09.01.2017
Quote:
Originally Posted by stabker
pawn Code:
stock Float: floatrandom(Float: fMin, Float: fMax, iDig) { iDig = _: floatpower(10.0, iDig); fMin = Float: (floatround(fMin * Float: iDig)); fMax = Float: (floatround(fMax * Float: iDig)); return (random((_: fMax - _: fMin)) + _: fMin) / Float: iDig; }
|
Почему везде приведение типа, а не преобразование?
Re: Random и Float -
stabker - 09.01.2017
Не я автор этой функции, просто где-то в англоязычном разделе нашел. Честно говоря, я не понимаю, как она работает, но работает. iDig это количество знаков после точки (типа вплоть до чего рандомизировать: десятых, сотых, тысячных и т.д.)
Quote:
Originally Posted by ZiGGi
Более оптимальная версия:
PHP Code:
stock Float:frandom(Float:max)
{
return floatdiv(float(random(0)), floatdiv(float(cellmax), max));
}
stock Float:mathfrandom(Float:min, Float:max)
{
return floatadd(frandom(floatadd(floatsub(max, min), 1.0)), min);
}
|
mathfrandom(1.5, 1.8 ) возвращает 2.605813 постоянно. Что-то не так.
Re: Random и Float -
ZiGGi - 09.01.2017
Quote:
Originally Posted by stabker
Не я автор этой функции, просто где-то в англоязычном разделе нашел. Честно говоря, я не понимаю, как она работает, но работает. iDig это количество знаков после точки (типа вплоть до чего рандомизировать: десятых, сотых, тысячных и т.д.)
mathfrandom(1.5, 1.8 ) возвращает 2.605813 постоянно. Что-то не так.
|
Вроде поправил:
PHP Code:
stock Float:mathfrandom(Float:min, Float:max)
{
return floatadd(frandom(floatsub(max, min)), min);
}
Re: Random и Float -
stabker - 09.01.2017
Quote:
Originally Posted by ZiGGi
Вроде поправил:
PHP Code:
stock Float:mathfrandom(Float:min, Float:max)
{
return floatadd(frandom(floatsub(max, min)), min);
}
|
Все равно она какое-то странное распределение дает. До ~тысячных результат получается одинаков (полагаю, что при большой выборке такого впечатления не будет).
Re: Random и Float -
Diman777 - 09.01.2017
Quote:
Originally Posted by stabker
iDig это количество знаков после точки (типа вплоть до чего рандомизировать: десятых, сотых, тысячных и т.д.)
|
Т.е. если iDig = 1, то например на выходе я получу 1.2, если iDig = 2, то 1.25 и т.д.
Re: Random и Float -
stabker - 09.01.2017
Quote:
Originally Posted by Diman777
Т.е. если iDig = 1, то например на выходе я получу 1.2, если iDig = 2, то 1.25 и т.д.
|
Да. Допустим нужно получить рандом в пределах от 1.3 до 1.5. Значит возможные значения будут:
iDig = 1: 1.3, 1.4
iDig = 2: 1.30, 1.31, 1.32, 1.33 ... 1.49
iDig = 3: 1.300, 1.301, 1.302, 1.303 ... 1.499
и т.д.