Вариант, который я бы предложил, будет использовать double
, а не float
.
Единственные недостатки, которые я когда-либо обнаружил, вступают в игру только в том случае, если у вас их большое количество, поскольку требования к хранению выше, и это, похоже, не так.
Если вы должны использовать float
, то решение, которое вы уже пробовали, возможно, является лучшим из доступных. Это фундаментальная проблема, что потеря точности при преобразовании double
в float
может дать вам 1.0f
.
Таким образом, вы можете использовать значение float в своем желаемом диапазоне.
Однако, вы не должны перец код с if
заявления для этого, просто обеспечивают поплавка случайную функцию, которая делает тяжелую работу за вас:
float frandom() {
float ret = 1.0f;
while (ret == 1.0f)
ret = (float) Math.random();
return ret;
}
или, согласно вашему образцу:
float frandom() {
float ret = (float) Math.random();
if (ret == 1.0f)
ret = 0.0f;
return ret;
}
затем вызвать его:
float rand = frandom();
Это будет пои nt, где было бы хорошо для Java (и других) иметь возможность Javascript «вводить» код в тип, чтобы вы могли реализовать frandom()
в статической арене Math
. Таким образом, вы могли бы просто использовать:
float rand = Math.frandom();
Но, увы, это не представляется возможным (насколько я знаю, не хватает перекомпиляции библиотеки поддержки Java, которая кажется немного излишним).
Кстати, если вы ищете для максимального значения с плавающей точкой меньше 1, это 0.99999994
(показатель степени, мультипликатор 2-1
со всеми мантиссами бит, установленных в 1
), так что вы можете использовать, что вместо 0.0f
в функции frandom()
выше.
Это почерпнуто из удобного инструмента, который я написал некоторое время назад, который оказался неоценимым, когда он играл с плавающей точкой IEEE754.
Есть причина, вы не можете использовать [nextFloat()] (https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#nextFloat--)? – VGR