如何在Java中生成随机正数和负数

38

我想在short原始数据类型的范围(-32768,32767)内生成随机整数。Java的Random对象只能生成正数。我该如何在该区间内随机生成数字?谢谢。


这让我想起了VB的Rnd()函数,它只返回[0,1)之间的值。 - pinichi
8个回答

60

您从(0, 32767+32768)范围内随机选择一个数,然后减去32768


24
Random random=new Random();
int randomNumber=(random.nextInt(65536)-32768);

scala> def myNextPositiveNumber :Int = { r.nextInt(65536)-32768} myNextPositiveNumber: Intscala> println(myNextPositiveNumber) -17761scala> println(myNextPositiveNumber) -26558scala> scala> println(myNextPositiveNumber) -17758scala> println(myNextPositiveNumber) -823scala> println(myNextPositiveNumber) 17370 - aironman

6
public static int generatRandomPositiveNegitiveValue(int max , int min) {
    //Random rand = new Random();
    int ii = -min + (int) (Math.random() * ((max - (-min)) + 1));
    return ii;
}

你在哪里使用rand函数? - WowBow
让我们举个例子,min = 2,max = 4。那么在最低随机数的情况下,假设为0.001,* ((4 - (-2)) + 1) = 7 * 0.001 = (int) 0.007 = 0,然后-2 + 0 = -2。所以实际上最小值是2,但我们得到了-2。这个公式中出了些问题。 - yoni

4

生成0到65535之间的数字,然后减去32768。


3
这是一个老问题,我知道但......
n=n-(n*2)

这行代码不会起作用。3 = 3 - (3*2),3 = -6。 - Renato Probst
1
错误。操作顺序不当。 - user2157850
不行,它还是不能工作。你是如何进行操作的? - GelatinFox
1
3-(3*2) = 3-(6) = -3 - user2157850
这有什么意义呢?这只是一种缓慢的写法 n = -n,但在 n*2 中可能会发生溢出。那个溢出有用吗?当 n=-32768 时,我们将得到 n = +32768,它超出了二进制补码范围 -32768 .. +32767。 - Peter Cordes

2

([我的双精度兼容原始类型])(Math.random() * [我的最大值] * (Math.random() > 0.5 ? 1 : -1))

例子:

// need a random number between -500 and +500
long myRandomLong = (long)(Math.random() * 500 * (Math.random() > 0.5 ? 1 : -1));

0
如果有人感兴趣使用双精度版本(请注意,如果传递了MAX_VALUE或MIN_VALUE,则会出现故障):
private static final Random generator = new Random();
public static double random(double min, double max) {
    return min + (generator.nextDouble() * (max - min));
 }

0

(Math.floor((Math.random() * 2)) > 0 ? 1 : -1) * Math.floor((Math.random() * 32767))

的意思是随机生成一个介于正负32767之间的整数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接