[英]How to create in Android Java a random number between min and max excluding some numbers that fall between min and max.?
[英]Java - limit number between min and max
只要數字在限制范圍內,我就想返回它,否則返回限制的最大值或最小值。 我可以結合Math.min
和Math.max
來做到這一點。
public int limit(int value) {
return Math.max(0, Math.min(value, 10));
}
我想知道是否存在我忽略的現有limit
或range
函數。
如果非常常見,歡迎使用 3rd 方庫(例如:Commons 或 Guava)
OP 在標准庫中要求此實現:
int ensureRange(int value, int min, int max) {
return Math.min(Math.max(value, min), max);
}
boolean inRange(int value, int min, int max) {
return (value>= min) && (value<= max);
}
可惜標准的 Math 庫缺少這些
從版本 21 開始, Guava包含Ints.constrainToRange()
(以及其他原語的等效方法)。 從發行說明:
添加了
constrainToRange([type] value, [type] min, [type] max)
方法,該方法將給定值限制在由min
和max
定義的封閉范圍內。 他們返回本身的價值,如果它的范圍之內,min
,如果是下面的范圍和max
,如果是上述范圍。
由@dimo414 從https://stackoverflow.com/a/42968254/122441復制。
不幸的是,截至 2017 年 7 月,此版本是最新版本,並且在某些項目中(請參閱https://stackoverflow.com/a/40691831/122441)Guava破壞了向后兼容性,這需要我現在繼續使用版本 19。 我也很震驚,Commons Lang 和 Commons Math 都沒有! :(
如果您使用的是 Android,請使用 MathUtils(在支持庫中),它只有一個專門執行此操作的函數,稱為clamp。
此方法采用數值並確保它適合給定的數值范圍。 如果數字小於范圍所需的最小值,則將返回范圍的最小值。 如果數字高於范圍允許的最大值,則將返回范圍的最大值。
Math.max(int a, int b)
函數定義為:
public static int min(int a, int b) {
return (a <= b) ? a : b;
}
因此,您可以按如下方式組合max
和min
函數:
private static int MAX=10;
private static int MIN=0;
public int limit(int a) {
return (a > MAX) ? MAX : (a < MIN ? MIN: a );
}
任何實現Comparable
類(包括Number
及其子類)的通用方法:
public static <T extends Comparable<? super T>> T limit(T o, T min, T max){
if (o.compareTo(min) < 0) return min;
if (o.compareTo(max) > 0) return max;
return o;
}
唯一的要求是所有參數必須屬於同一類。 它可以防止可能的類型轉換丟失。 事實上,將float
與double
of long
與int
等進行比較是不正確的。例如(double) 0.1 != (float) 0.1
。
用法:
double x = 13.000000001;
x = limit(x, 12.0, 13.0);
System.out.println("x = " + x); //x = 13.0
不幸的是,不可能僅通過limit(x, 12.0, 13.0)
直接更改第一個參數limit(x, 12.0, 13.0)
因為原始類型是不可變的。
您不需要為此使用外部庫,請嘗試以下測試用例:
public class RandomNumber {
public static void main(String[] Args) {
System.out.println("random = " + randomInRange(5,10));
}
public static double randomInRange(double arg1, double arg2) {
double my_number = Math.ceil(Math.random() * (arg1 - arg2) + arg2);
return my_number;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.