Random и Float
#1

Есть функция Random(min, max); возможно ли сделать так, чтобы она выдавала рандомное значение типа Float?
Reply
#2

разобрался
Reply
#3

а не, помощь все еще нужна.
Reply
#4

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;
}
Reply
#5

Благодарю
Reply
#6

Как раз ищу такую ф-ию. Но не понял зачем 3-ий аргумент? Нельзя без него обойтись?
Если не трудно, объясни, как так получилось, что ф-ия возвращает рандомное? Так бы и сам написал ф-ию, но чё-то не пойму смысла.
Reply
#7

Более оптимальная версия:
PHP Code:
stock Float:frandom(Float:max

    return 
floatdiv(float(random(0)), floatdiv(float(cellmax), max)); 
}
stock Float:mathfrandom(Float:minFloat:max)
{
    return 
floatadd(frandom(floatsub(maxmin)), min);

Reply
#8

Спасибо ZiGGi, но stabker объясни потом зачем 3-ий аргумент)
Reply
#9

Quote:
Originally Posted by Diman777
View Post
объясни потом зачем 3-ий аргумент)
Количество знаков после запятой.
Reply
#10

Quote:
Originally Posted by stabker
View Post
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;
}
Почему везде приведение типа, а не преобразование?
Reply
#11

Не я автор этой функции, просто где-то в англоязычном разделе нашел. Честно говоря, я не понимаю, как она работает, но работает. iDig это количество знаков после точки (типа вплоть до чего рандомизировать: десятых, сотых, тысячных и т.д.)

Quote:
Originally Posted by ZiGGi
View Post
Более оптимальная версия:
PHP Code:
stock Float:frandom(Float:max

    return 
floatdiv(float(random(0)), floatdiv(float(cellmax), max)); 
}
stock Float:mathfrandom(Float:minFloat:max)
{
    return 
floatadd(frandom(floatadd(floatsub(maxmin), 1.0)), min);

mathfrandom(1.5, 1.8 ) возвращает 2.605813 постоянно. Что-то не так.
Reply
#12

Quote:
Originally Posted by stabker
View Post
Не я автор этой функции, просто где-то в англоязычном разделе нашел. Честно говоря, я не понимаю, как она работает, но работает. iDig это количество знаков после точки (типа вплоть до чего рандомизировать: десятых, сотых, тысячных и т.д.)



mathfrandom(1.5, 1.8 ) возвращает 2.605813 постоянно. Что-то не так.
Вроде поправил:
PHP Code:
stock Float:mathfrandom(Float:minFloat:max

    return 
floatadd(frandom(floatsub(maxmin)), min); 

Reply
#13

Quote:
Originally Posted by ZiGGi
View Post
Вроде поправил:
PHP Code:
stock Float:mathfrandom(Float:minFloat:max

    return 
floatadd(frandom(floatsub(maxmin)), min); 

Все равно она какое-то странное распределение дает. До ~тысячных результат получается одинаков (полагаю, что при большой выборке такого впечатления не будет).
Reply
#14

Quote:
Originally Posted by stabker
View Post
iDig это количество знаков после точки (типа вплоть до чего рандомизировать: десятых, сотых, тысячных и т.д.)
Т.е. если iDig = 1, то например на выходе я получу 1.2, если iDig = 2, то 1.25 и т.д.
Reply
#15

Quote:
Originally Posted by Diman777
View Post
Т.е. если 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
и т.д.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)