从Min到Max生成随机整数?

我想生成一个随机的Integer:

  1. 在[Min,Max]范围内
  2. 范围可以是[5,20],[ – 29,-3]或[-13,13](它可以在任何范围内,正或负或介于两者之间)
  3. 代码在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

关于这段代码的一些事情让我很谨慎:

 return min + (int)(Math.random() * (max - min + 1)); } 

当施放四舍五入时,可以施放到整数:

 int someRandomDoubleRoundedToInteger = (int)(someDouble + 0.5) 

它有用吗? 这对我有利,也许其他一些新手会觉得好笑,或者我犯了一个大错:

让我们选择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}区间之间可以表示多少个不同的数字,它们是均匀间隔的吗?

我认为它有效。