SA-MP Forums Archive
Random и Float - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Random и Float (/showthread.php?tid=529173)



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:minFloat:max)
{
    return 
floatadd(frandom(floatsub(maxmin)), min);




Re: Random и Float - Diman777 - 09.01.2017

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


Re: Random и Float - ZiGGi - 09.01.2017

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


Re: Random и Float - Stepashka - 09.01.2017

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;
}
Почему везде приведение типа, а не преобразование?


Re: Random и Float - stabker - 09.01.2017

Не я автор этой функции, просто где-то в англоязычном разделе нашел. Честно говоря, я не понимаю, как она работает, но работает. 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 постоянно. Что-то не так.


Re: Random и Float - ZiGGi - 09.01.2017

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); 




Re: Random и Float - stabker - 09.01.2017

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

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

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


Re: Random и Float - Diman777 - 09.01.2017

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


Re: Random и Float - stabker - 09.01.2017

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
и т.д.