从Min到Max生成随机整数?
我想生成一个随机的Integer:
- 在[Min,Max]范围内
- 范围可以是[5,20],[ – 29,-3]或[-13,13](它可以在任何范围内,正或负或介于两者之间)
- 代码在Android中正常运行
到目前为止我得到的是这个,但似乎不适用于负范围!
1 + (int)(Math.random() * ((Max - Min) + 1));
我很确定你想要的
Min+(int)(Math.random()*((Max-Min) + 1));
但是,我应该指出范围[-3,-29]的最小值和最大值相反。 (与Merlyn指出的[5,-13]相同。)
如果您只想为该范围输入任意两个数字,则a和b然后使用该代码
int Min = Math.min(a,b); int Max = Math.max(a,b);
这样你就不用担心订单了。 这甚至适用于== b。
试试这个
int min = -100; int max = 100; Random rand = new Random(); return rand.nextInt(max - min + 1) + min;
有没有人提到他的最小和最大被逆转? 因为那就是搞砸了他的代码。
编辑
另一件让他的代码搞乱的事情是:它应该是Min +
而不是1 +
/** * @param bound1 an inclusive upper or lower bound * @param bound2 an inclusive lower or upper bound * @return a uniformly distributed pseudo-random number in the range. */ public static int randomInRange(int bound1, int bound2) { int min = Math.min(bound1, bound2); int max = Math.max(bound1, bound2); return min + (int)(Math.random() * (max - min + 1)); }
如果调用者可以保证bound1
将小于或等于bound2
,则可以跳过确定最小和最大边界的步骤; 例如
/** * @param min the inclusive lower bound * @param max the inclusive upper bound * @return a uniformly distributed pseudo-random number in the range. */ public static int randomInRange(int min, int max) { return min + (int)(Math.random() * (max - min + 1)); }
我没有在Android上对此进行测试,但它应该适用于任何支持这些方法的Java或类似Java的平台,以符合标准(Sun)Java SE规范。
您只需计算min和max示例-30和30之间的差值得到:delta < - 绝对值(30 - (-30))然后找到0和delta之间的随机数。
有一篇与此相关的post。 然后按照常数min将数字沿着数字线转换。
如果使用Random类:1)将此处添加到Random.nextInt(someInt)的等式中,因为nextInt返回:someVal 关于这段代码的一些事情让我很谨慎: 当施放四舍五入时,可以施放到整数: 它有用吗? 这对我有利,也许其他一些新手会觉得好笑,或者我犯了一个大错: 让我们选择1和10开始。 选择1到10之间的数字(包含)我选择10 Math.Random排除0和1.所以0.9999999999999999 *(10 – 1 + 1)= 9.999999999999999强制转换为int,所以在小数生成9后抛出所有内容我们加1到9返回10.(使用随机的任何东西来自(。 9到.999999999999)也会产生10 我想从1到10之间选择1。 在这种情况下,随机方法将其最接近的值推出为零说:0.00000000000000001 *(10 – 1 + 1)转换为int为0 0我们返回1 + 0。 这样才行。 嗯,似乎工作。 看起来像是一个非常非常非常小的偏见1,因为我们永远不会将“0”作为一种可能性,但它应该是可以接受的。 该方法有效,如果随机生成器均匀覆盖0到1之间的整个区域。{0,1}区间之间可以表示多少个不同的数字,它们是均匀间隔的吗? 我认为它有效。
return min + (int)(Math.random() * (max - min + 1)); }
int someRandomDoubleRoundedToInteger = (int)(someDouble + 0.5)